sql >> データベース >  >> NoSQL >> MongoDB

MongoDB:入力ドキュメント変数との一致の使用

    これは、$ 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" ] } } } ])
    

    テスト: モンゴプレイグラウンド



    1. 最近保存されたキーがLaravel経由で表示されないRedisCLI

    2. マングースにネストされたエンティティを取り込む方法は?

    3. MongoDB $ mul

    4. CouchbaseDbaの便利なスクリプト