MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

tra cứu tổng hợp mongoDB trên mảng đối tượng lồng nhau

Bạn có thể sử dụng đường ống tổng hợp bên dưới.

$ lookup để điền đại lý, sau đó là $ Reduce và $ concatArrays để thu thập tất cả id khách hàng và $ lookup để lấy thông tin chi tiết về khách hàng.

$ addFields với $ map để lặp lại mảng nhiệm vụ và đối với mỗi khách hàng ánh xạ thông tin khách hàng từ giai đoạn trước bằng cách tra cứu theo id khách hàng và $ mergeObjects để giữ các trường khác. giai đoạn $ project để loại bỏ các trường thừa.

Mongo db 3.6 trở lên

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 nhỏ hơn 3,6

$ lookup để điền đại lý, sau đó $ unwind để tiếp cận khách hàng và tra cứu để lấy thông tin chi tiết về khách hàng. Tua lại với $ group để đưa trở lại cấu trúc ban đầu với các giá trị đã phổ biến.

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. Tôi nên đặt dòng thời gian hoạt động ở đâu trong mongodb, được nhúng trong người dùng hoặc riêng biệt?

  2. @CompoundIndex không hoạt động trong Spring Data MongoDB

  3. Di chuyển MongoDB sang DynamoDB, Phần 2

  4. Đường ống tổng hợp Cosmos DB không tương thích (Mongo API)?

  5. Cách cài đặt MongoDB