mongoose _idと文字列の比較


197

次のように、データをプルしてオブジェクトに貼り付ける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)が支援できませんでした。

回答:


360

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

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

等。


13

4
既に使用しているmongoose場合はrequire('mongoose').mongo.ObjectID、追加の依存関係をリストする必要がないようにできます
JoshuaDavid

63

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

if (results.userId.equals(AnotherMongoDocument._id)) {
    ...
}

17

オブジェクトIDを(toString()メソッドを使用して)文字列に変換すると、この処理が実行されます。


8

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

indexOf()特定のIDの参照の配列内をチェックするために使用する必要がある場合の答えの例を次に示します。assume queryは実行中のクエリで、assume someModelは探しているIDのmongoモデルです。最後に、assume 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);
});

1
またはワンライナー:let exists = results.idList.filter(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor).length ? true : false
Zlatko

4
@Zlatko私は新しい構文の大ファンではありませんが、それぞれの独自のファンです。
r3wt 2016年

2
@Zlatko const exists = results.idList.some(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor) または const exists = results.idList.some(val => val.equals(someModel._id))
axanpi

1
@Zlatkoはこれらすべての年後、そして何を推測します。私は今私のバージョンよりもあなたのバージョンを好む。適切な属性で回答に追加してもよろしいですか?
r3wt 2018

1
進歩の代償:)もちろん、あなたは答えを使うことができます、それはその目的が可能であれば代替案を提供するか、または助けることでした。
Zlatko

6

上記に従って、私は問題を解決する3つの方法を見つけました。

  1. AnotherMongoDocument._id.toString()
  2. JSON.stringify(AnotherMongoDocument._id)
  3. results.userId.equals(AnotherMongoDocument._id)

0

私はまったく同じ問題に直面しました、そして私は以下の助けを借りて問題を単に解決しましたJSON.stringify():-

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

0

ここで提案されている3つの可能なソリューションには、異なる使用例があります。

  1. このような2つのmongoDocumentsでObjectIDを比較する場合は、.equalsを使用します

    results.userId.equals(AnotherMongoDocument._id)

  2. ObjectIDの文字列表現をmongoDocumentのObjectIDと比較する場合は、.toString()を使用します。このような

    results.userId === AnotherMongoDocument._id.toString()


3番目に可能な解決策は何ですか?
Chris Catignani
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.