首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对嵌套对象数组的mongoDB聚合查找

对嵌套对象数组的mongoDB聚合查找
EN

Stack Overflow用户
提问于 2019-09-24 22:32:18
回答 1查看 2.4K关注 0票数 3

我有一个如下所示的集合,我在执行$lookup并返回它时遇到了麻烦,因为它是以填充字段的形式返回的:

我已经对要填充的字段进行了注释,这些字段是(座席、missions.clients.client)

代码语言:javascript
运行
复制
 {  
   "title":"Tournée libre",
   "agent":"5d811943d2a2100017667228", // needs to be populated
   "missions":[  
      {  
         "_id":"5d8a075346f10d679ab4383e",
         "title":"Journée 3",
         "clients":[  
            {  
               "_id":"5d8a075346f10d679ab4383f",
               "valid":true,
               "client":"5d1bc39aa2af623b94363b33", // this needs to be populated
               "visit_time":"2019-09-24T12:03:38.383Z"
            },
            {  

               "_id":"5d8a0dc446f10d679ab43888",
               "valid":true,
               "client":"5d8a0c8346f10d679ab43886",
               "visit_time":"2019-09-24T12:34:23.210Z"
            },

         ]
      }
   ],
   "created_at":"2019-09-24T12:08:51.928Z",
   "__v":2
}

结果应该是这样的:

代码语言:javascript
运行
复制
 {  
   "title":"Tournée libre",
   "agent": {firstname: 'something', lastname: 'something else'}
   "missions":[  
      {  
         "_id":"5d8a075346f10d679ab4383e",
         "title":"Journée 3",
         "clients":[  
            {  
               "_id":"5d8a075346f10d679ab4383f",
               "valid":true,
               "client": {firstname: 'something', lastname: 'something else'},
               "visit_time":"2019-09-24T12:03:38.383Z"
            },
            {  

               "_id":"5d8a0dc446f10d679ab43888",
               "valid":true,
               "client":{firstname: 'something', lastname: 'something else'},
               "visit_time":"2019-09-24T12:34:23.210Z"
            },

         ]
      }
   ],
   "created_at":"2019-09-24T12:08:51.928Z",
   "__v":2
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-29 21:11:29

您可以使用下面的聚合管道。

使用$lookup填充代理,然后使用$reduce和$concatArrays收集所有客户端ids,使用$lookup获取客户端详细信息。

使用$addFields和$map来迭代任务数组,对于每个客户端,通过按客户端id和$mergeObjects进行查找来映射来自前一阶段的客户端信息,以保留其他字段。$project阶段删除额外的字段。

Mongo db 3.6及以上版本

代码语言:javascript
运行
复制
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小于3.6

使用$lookup填充代理,然后使用$unwind访问客户端并查找以获取客户端详细信息。使用$group回放以带回填充了值的原始结构。

代码语言:javascript
运行
复制
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"
      }
    }
 }}
])
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58082664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档