web-dev-qa-db-ja.com

MongoDB:2つの等しいフィールド、$ matchと$ eqを持つドキュメントのクエリ

Document.a == document.bが必要な場合、コレクション内のすべてのドキュメントを返す最良の方法は何ですか?

私はもう試した

db.collection.aggregate([ { $match: { $eq: [ '$a', '$b' ] } }])

しかし、文字列 "$ a"と "$ b"に文字列が一致すると想定しているため、エラーや結果は返されません。これらがフィールドであることを指定する別の方法はありますか?

db.collection.aggregate([    { $project: { 
    eq: { $cond: [ { $eq: [ '$a', '$b' ] }, 1, 0 ] } 
} },
{ $match: { eq: 1 } }])

上記は機能しますが、見つかったドキュメントをもう一度クエリするか、すべての可能なフィールドを投影する追加の手順が必要です。

このクエリを達成するためのより良い方法はありますか?

17
Peter Sampson

基本的に、自己結合を実行しようとしています。 MongoDBでサポートされていない操作。

ご想像のとおり、$eq演算子について:

あなたが提案したように、追加の$projectステップを使用する以外に必要なことを実行する方法が他にありません。

とにかく、クエリでインデックスを使用できず、MongoDBがフルスキャンを実行するため、これは大幅に高価ではないことに注意してください。

4
Sylvain Leroux

私があなたの質問を正しく理解していれば、field1とfield2の値が同じであるドキュメントが必要です。

このために

db.coll.find({$where: function() { return this.field1 == this.field2 } } );

以上のコンパクト

db.coll.find({ $where : "this.field1 == this.field2" } );
10
Shivangi Gupta