265

次のように、データを取得してオブジェクトに貼り付ける node.js アプリケーションがあります。

var results = new Object();

User.findOne(query, function(err, u) {
    results.userId = u._id;
}

その保存された ID に基づいて if/then を実行すると、比較が真になることはありません。

if (results.userId == AnotherMongoDocument._id) {
    console.log('This is never true');
}

2 つの ID の console.log を実行すると、正確に一致します。

User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002

これはある種のデータ型の問題だと思いますが、results.userId を上記の比較が真になるデータ型に変換する方法がわかりません。外部委託した頭脳 (別名 Google) は役に立ちませんでした。

4

7 に答える 7

454

Mongoose は、カスタム ObjectID タイプを使用する mongodb-native ドライバーを使用します。ObjectID と.equals()メソッドを比較できます。あなたの例では、results.userId.equals(AnotherMongoDocument._id). toString()ObjectIDの文字列化されたバージョンを JSON 形式または Cookie で保存する場合は、ObjectID タイプにもメソッドがあります。

ObjectID = require("mongodb").ObjectID(mongodb-native ライブラリが必要) を使用する場合は、 が有効な識別子であるかどうかを で確認できresults.userIdますresults.userId instanceof ObjectID

等。

于 2012-07-24T19:38:21.100 に答える
74

ObjectIDs はオブジェクトであるため、単にそれらを比較する==と、それらの参照が比較されます。それらの値を比較したい場合は、次のObjectID.equalsメソッドを使用する必要があります。

if (results.userId.equals(AnotherMongoDocument._id)) {
    ...
}
于 2012-07-24T19:38:07.513 に答える
11

上記によると、問題を解決する3つの方法が見つかりました。

  1. AnotherMongoDocument._id.toString()
  2. JSON.stringify(AnotherMongoDocument._id)
  3. results.userId.equals(AnotherMongoDocument._id)
于 2019-02-21T04:00:29.230 に答える
8

受け入れられた回答は、コードでできることを実際に制限します。たとえばObject Ids、equals メソッドを使用して の配列を検索することはできません。代わりに、常に文字列にキャストしてキーを比較する方が理にかなっています。

indexOf()特定のIDの参照の配列内をチェックするために使用する必要がある場合の回答例を次に示します。仮定queryは実行中のクエリ、仮定someModelは探している ID の mongo モデル、最後に仮定results.idListはオブジェクト ID を探しているフィールドです。

query.exec(function(err,results){
   var array = results.idList.map(function(v){ return v.toString(); });
   var exists = array.indexOf(someModel._id.toString()) >= 0;
   console.log(exists);
});
于 2016-05-24T18:58:26.773 に答える