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

埋め込まれたドキュメントをmongoDBを使用して親フィールドと比較します

    標準クエリでは、ドキュメント内の値を「比較」することはできません。これは実際には.aggregate()を使用して行うことです および $redact

    db.collection.aggregate([
      { "$redact": {
        "$cond": {
          "if": {
            "$gt": [
              { "$size": {
                "$filter": {
                  "input": "$offers",
                  "as": "o",
                  "cond": { "$eq": [ "$$o.amount", "$amount" ] }
                }
              }},
              0
            ]
          },
          "then": "$$KEEP",
          "else": "$$PRUNE"
        }
      }}
    ])
    

    ここでは、 $filterを使用します。 "amount"の値を比較します 親ドキュメント内の配列内のものに。少なくとも1つが「等しい」場合、"$$KEEP" ドキュメント、それ以外の場合は"$$PRUNE"

    最新バージョンでは、$indexOfArray

    db.collection.aggregate([
      { "$redact": {
        "$cond": {
          "if": {
            "$ne": [
              { "$indexOfArray": [ "$offers.amount", "$amount" ] },
              -1
            ]
          },
          "then": "$$KEEP",
          "else": "$$PRUNE"
        }
      }}
    ])
    

    実際に「一致する配列要素」のみが必要な場合は、 $filter 投影中:

    db.collection.aggregate([
      { "$redact": {
        "$cond": {
          "if": {
            "$gt": [
              { "$size": {
                "$filter": {
                  "input": "$offers",
                  "as": "o",
                  "cond": { "$eq": [ "$$o.amount", "$amount" ] }
                }
              }},
              0
            ]
          },
          "then": "$$KEEP",
          "else": "$$PRUNE"
        }
      }},
      { "$project": {
        "amount": 1,
        "offers": {
          "$filter": {
            "input": "$offers",
            "as": "o",
            "cond": { "$eq": [ "$$o.amount", "$amount" ] }
          }
        }
      }}
    ])
    

    ただし、主な原則はもちろん、返されるドキュメントの数をのみに「減らす」ことです。 「最優先」として条件に実際に一致するもの。そうしないと、後で破棄する結果を得るために、時間とリソースを費やしている不要な計算と作業を行っているだけです。

    したがって、最初に「フィルタリング」し、次に優先順位として「再形成」します。



    1. $exprを使用した$nin

    2. _docオブジェクト内のマングースリターンデータ

    3. MongoDBのフィールドを更新するmongooseが機能しない

    4. Mongoengineは、ネイティブのpymongoの使用法と比較して、大きなドキュメントでは非常に低速です。