MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

pencarian agregat mongoDB pada array objek bersarang

Anda bisa menggunakan pipa agregasi di bawah ini.

$lookup untuk mengisi agen diikuti oleh $reduce dan $concatArrays untuk mengumpulkan semua id klien dan $lookup untuk mendapatkan detail klien.

$addFields dengan $map untuk mengulangi larik misi dan untuk setiap klien memetakan info klien dari tahap sebelumnya dengan mencari berdasarkan id klien dan $mergeObjects untuk mempertahankan bidang lainnya. $project stage untuk menghapus kolom tambahan.

Mongo db 3.6 ke atas

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}}
])

Mongo db kurang dari 3.6

$lookup untuk mengisi agen diikuti oleh $unwind untuk menjangkau klien dan mencari untuk mendapatkan detail klien. Putar ulang dengan $group untuk mengembalikan ke struktur asli dengan nilai yang terisi.

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Konversikan tanggal ISO ke format yyyy-mm-dd

  2. Cara menggunakan bidang yang sama beberapa kali di MongoDB menemukan kueri di NodeJS

  3. kelas dan antarmuka untuk menulis Model dan skema Mongoose yang diketik di TypeScript menggunakan pasti diketik

  4. Mongodb TTL kedaluwarsa dokumen lebih awal

  5. mongodb memperbarui elemen array terakhir