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 } }])
上記は機能しますが、見つかったドキュメントをもう一度クエリするか、すべての可能なフィールドを投影する追加の手順が必要です。
このクエリを達成するためのより良い方法はありますか?
基本的に、自己結合を実行しようとしています。 MongoDBでサポートされていない操作。
ご想像のとおり、$eq
演算子について:
$eq
比較クエリ演算子 は、valueに対してフィールドを照合します。$eq
比較集計演算子 は、2つの式の値を比較します。あなたが提案したように、追加の$project
ステップを使用する以外に必要なことを実行する方法が他にありません。
とにかく、クエリでインデックスを使用できず、MongoDBがフルスキャンを実行するため、これは大幅に高価ではないことに注意してください。
私があなたの質問を正しく理解していれば、field1とfield2の値が同じであるドキュメントが必要です。
このために
db.coll.find({$where: function() { return this.field1 == this.field2 } } );
以上のコンパクト
db.coll.find({ $where : "this.field1 == this.field2" } );