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

オブジェクトのネストされた配列に対するmongoDB集約ルックアップ

    以下の集約パイプラインを使用できます。

    $ lookupはエージェントにデータを入力し、次に$reduceと$concatArraysを使用してすべてのクライアントIDを収集し、$lookupを使用してクライアントの詳細を取得します。

    $ addFieldsと$mapを使用してミッション配列を反復し、クライアントごとに、クライアントIDと$ mergeObjectsでルックアップして前のステージのクライアント情報をマップし、他のフィールドを保持します。 $projectステージで余分なフィールドを削除します。

    Mongodb3.6以降

    Model.aggregate([
     {"$lookup":{
      "from":"agents",
      "localField":"agent",
      "foreignField":"_id",
      "as":"agent"
     }},
     {"$addFields":{"agent":{"$arrayElemAt":["$agent",0]}}},
     {"$addFields":{
       "client_ids":{
         "$reduce":{
           "input":"$missions",
           "initialValue":[],
           "in": {"$concatArrays":["$$value","$$this.clients.client"]}
         }
       }
     }},
     {"$lookup":{
       "from":"clients",
       "localField":"client_ids",
       "foreignField":"_id",
       "as":"client_info"
     }},
     {"$addFields":{
       "missions":{
         "$map":{
           "input":"$missions",
           "in":{
             "$mergeObjects":[
               "$$this",
               {"clients":{"$map":{
                 "input":"$$this.clients",
                 "in":{"$mergeObjects":[
                   "$$this",
                  {"client":{"$arrayElemAt":[
                    "$client_info",
                    {"$indexOfArray":["$client_ids","$$this._id"]}
                  ]}}
                ]}
               }}}
             ]
           }
         }
       }
     }},
     {"$project":{"client_ids":0,"client_info":0}}
    ])
    

    Mongodbが3.6未満

    $ lookupでエージェントにデータを入力し、次に$ unwindでクライアントに到達し、ルックアップしてクライアントの詳細を取得します。 $ groupで巻き戻し、値が入力された元の構造に戻します。

    Model.aggregate([
     {"$lookup":{
      "from":"agents",
      "localField":"agent",
      "foreignField":"_id",
      "as":"agent"
     }},
     {"$addFields":{"agent":{"$arrayElemAt":["$agent",0]}}},
     {"$unwind":"$missions"},
     {"$unwind":"$missions.clients"},
     {"$lookup":{
       "from":"clients",
       "localField":"missions.clients.client",
       "foreignField":"_id",
       "as":"missions.clients.client"
     }},
     {"$addFields":{"missions.clients.client":{"$arrayElemAt":["$missions.clients.client",0]}}},
     {"$group":{
       "_id":{"_id":"$_id","mission_id":"$missions._id"},
       "agent":{"$first":"$agent"},
       "title":{"$first":"$missions.title"},
       "clients":{"$push":"$missions.clients"}
     }},
     {"$group":{
       "_id":"$_id._id",
       "agent":{"$first":"$agent"},
       "missions":{
         "$push":{
           "_id":"$_id.mission_id",
           "title":"$title",
           "clients":"$clients"
          }
        }
     }}
    ])
    



    1. MongoDBとNode.jsを使用して複数のオブジェクトをアップサートするにはどうすればよいですか?

    2. 値を持つキーをどのように検索しますか?たとえば、値がsomevalueであるすべてのKEYSを取得します

    3. MongoDBのリフトストアBigDecimal

    4. MongoDBの$in句は順序を保証しますか