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

オブジェクトの配列によるルックアップ

    基本的に、 $unwindを実行する必要があります。 最初にアレイ。 MongoDBは、配列内のオブジェクトの「内部」プロパティを $lookup

    また、効率を上げるために、実際には $concatArraysを使用する必要があります。 最初にアレイソースを「結合」し、次に1つだけ実行します $lookup 操作:

    Project.aggregate([
      { "$match": { "project_id": projectId} },
      { "$project": {
        "project_id": 1,
        "updated_at": 1,
        "created_at": 1,
        "owner": 1,
        "name": 1,
        "combined": {
          "$concatArrays": [
            { "$map": {
              "input": {
                "$filter": {
                  "input": "$uploaded_files",
                  "as": "uf",
                  "cond": { "$eq": ["$$uf.upload_id", uploadId ] }
                }
              },
              "as": "uf",
              "in": {
                "$arrayToObject": {
                  "$concatArrays": [
                    { "$objectToArray": "$$uf" },
                    [{ "k": "type", "v": "uploaded_files" }]
                  ]
                }
              }
            }},
            { "$map": {
              "input": {
                "$filter": {
                  "input": "$file_history",
                  "as": "fh",
                  "cond": { "$eq": ["$$fh.upload_id", uploadId ] }
                }
              },
              "as": "fh",
              "in": {
                "$arrayToObject": {
                  "$concatArrays": [
                    { "$objectToArray": "$$fh" },
                    [{ "k": "type", "v": "file_history" }]
                  ]
                }
              }
            }}
          ]
        }
      }},
      { "$unwind": "$combined" },
      { "$lookup": {
        "from": "files",
        "localField": "combined.file",
        "foreignField": "_id",
        "as": "combined.file"
      }},
      { "$unwind": "$combined.file" },
      { "$lookup": {
        "from": "users",
        "localField": "owner",
        "foreignField": "_id",
        "as": "owner"
      }},
      { "$unwind": "$owner" },
      { "$group": {
        "_id": "$_id",
        "project_id": { "$first": "$project_id" },
        "updated_at": { "$first": "$updated_at" },
        "created_at": { "$first": "$created_at" },
        "owner": { "$first": "$owner" },
        "name": { "$first": "$name" },
        "combined": { "$push": "$combined" }
      }},
      { "$project": {
        "project_id": 1,
        "updated_at": 1,
        "created_at": 1,
        "owner": 1,
        "name": 1,
        "uploaded_files": {
          "$filter": {
            "input": "$combined",
            "as": "cf",
            "cond": { "$eq": [ "$$cf.type", "uploaded_files" ] }
          }    
        },
        "file_history": {
          "$filter": {
            "input": "$combined",
            "as": "cf",
            "cond": { "$eq": [ "$$cf.type", "file_history" ] }
          }    
        }
      }}
    ])
    

    一言で言えば

    1. 2つのアレイをソースにまとめてタグを付けてから、 $unwind 最初

    2. $lookupを実行します 詳細と $unwind それ

    3. $lookupを実行します 他の外国のソースと $unwind それ

    4. $group ドキュメントを単一の配列と一緒に戻します。

    5. $filter 配列を「分離」するために追加した「タグ名」または「タイプ」フィールドによって。

    $unwindを使用するだけで、同じ種類のプロセスに従うことができます。 各アレイで、「結合」を実行し、グループ化して戻します。しかし、実際には、そもそも単に「組み合わせる」よりも、はるかに多くのステップが必要です。




    1. SpringBootとmongodbでの接続プール

    2. SpringとMongoDB:Bean定義の読み取り中のSAXParseException

    3. マングースでスキーマを渡さずにコレクションをクエリする

    4. MongoDBは、Goでプレフィックスが指定されたデータベースを一覧表示します