これは、$ lookuppipelineで入力変数を使用している場合、$ expr
を使用する必要があることを意味しますか?
はい、正解です。デフォルトでは、フィルターにあります。 .find()
のフィルター部分 または$match
集計段階では、ドキュメント内の既存のフィールドを使用できません。
クエリフィルターで既存のフィールドの値を使用する必要がある場合は、集計パイプラインを使用する必要があります。したがって、 .find()
で集計パイプラインを使用するには または$match
フィルタクエリを$exprでラップする必要があります。 let
を使用して作成されたローカル変数にアクセスする同じ方法 $ lookup
の $ match
でフィルタリングする $ expr
でラップする必要があります 。
以下の例を考えてみましょう:
サンプルドキュメント:
[
{
"key": 1,
"value": 2
},
{
"key": 2,
"value": 4
},
{
"key": 5,
"value": 5
}
]
クエリ:
db.collection.find({ key: { $gt: 1 }, value: { $gt: 4 } })
Or
db.collection.aggregate([ { $match: { key: { $gt: 1 }, value: { $gt: 4 } } } ])
テスト: モンゴプレイグラウンド
上記のクエリが表示された場合は、両方の入力 1
& 4
クエリに渡されますが、 key
と一致させようとするクエリの下をチェックします フィールド==値コード> フィールド-機能しません:
db.collection.aggregate([ { $match: { key: { $eq: "$value" } } } ])
テスト: モンゴプレイグラウンド
上記では、2つの既存のフィールドを比較しているため、 key
を使用してドキュメントをチェックしているため、これを行うことはできません。 文字列としてのフィールド値"$value"
。つまり、文字列ではないと言うと、実際には value
への参照です。 以下のような$eqクエリ演算子ではなく$eq集計演算子を使用する必要があるフィールド:
db.collection.aggregate([ { $match: { $expr: { $eq: [ "$key", "$value" ] } } } ])
テスト: モンゴプレイグラウンド