2017-03-29 72 views
0

我在MongoDB的聚合方面存在问题。Mongodb聚合从文档内部检索文档

在我的“Job”文档中,它有creatorParent(单值)和Children(MongoDB对象id数组)。在“用户”文档中,用户具有包含子详细信息的子数组。

当用户请求检索此文档时,我想要聚合子详细信息,如果数组包含子的id。

我写了一个聚合有一些帮助,它为creatorParent工作,但无论我尝试过,它没有为儿童工作。

db.getCollection('Jobs').aggregate([ 
    { 
     $unwind: { 
      path : "$children" 
     } 
    }, 
    { 
     $lookup: { 
      "from" : "Users", 
      "localField" : "creatorparent", 
      "foreignField" : "_id", 
      "as" : "creatorparent" 
     } 
    }, 
    { 
     $lookup: { 
      "from" : "Users", 
      "localField" : "children", 
      "foreignField" : "children", 
      "as" : "children" 
     } 
    } 
]) 

用户文档:

{ 
    "_id" : ObjectId("58daf84877733645eaa9b44f"), 
    "email" : "[email protected]", 
    "password" : "vpGl+Fjnef616cRgNbCkwaFDpSI=", 
    "passwordsalt" : "99397F4A9D3A499D96694547667E74595CE994D2E83345D6953EF866303E8B65", 
    "children" : [ 
     { 
      "_id" : ObjectId("58daf84977733645eaa9b450"), 
      "name" : "Mert", 
      "age" : 5, 
      "additionalinformation" : "ilk cocuk", 
      "creationtime" : ISODate("2017-03-28T23:56:56.952Z"), 
      "userid" : ObjectId("58daf84877733645eaa9b44f"), 
      "gender" : null 
     }, 
     { 
      "_id" : ObjectId("58daf84977733645eaa9b451"), 
      "name" : "Sencer", 
      "age" : 7, 
      "additionalinformation" : "ikinci cocuk", 
      "creationtime" : ISODate("2017-03-28T23:56:56.952Z"), 
      "userid" : ObjectId("58daf84877733645eaa9b44f"), 
      "gender" : null 
     } 
    ] 
} 

工作

{ 
    "_id" : ObjectId("58db0a2d77733645eaa9b453"), 
    "creationtime" : ISODate("2017-03-29T01:13:17.509Z"), 
    "startingtime" : ISODate("2017-04-03T13:00:00.000Z"), 
    "endingtime" : ISODate("2017-04-03T17:00:00.000Z"), 
    "children" : [ 
     ObjectId("58daf84977733645eaa9b450"), 
     ObjectId("58daf84977733645eaa9b451") 
    ], 
    "creatorparent" : ObjectId("58daf84877733645eaa9b44f"), 
    "applicants" : [] 
} 
+0

请从'Jobs'和'Users' – felix

+0

@felix我添加样本文档我补充了一些例子 –

回答

1

试试这个:

db.jobs.aggregate(
    [ 
     { 
      $unwind: { 
       path : "$children", 
      } 
     }, 
     { 
      $lookup: { 
       "from" : "users", 
       "localField" : "creatorparent", 
       "foreignField" : "_id", 
       "as" : "creatorparent" 
      } 
     }, 
     { 
      $lookup: { 
       "from" : "users", 
       "localField" : "children", 
       "foreignField" : "children._id", 
       "as" : "children" 
      } 
     }, 
     { 
      $addFields: { 
       children : {$arrayElemAt : ["$children",0]} 
      } 
     }, 
     { 
      $addFields: { 
       "children":"$children.children" 
      } 
     }, 
     { 
      $unwind: { 
       path : "$children", 
      } 
     }, 
     { 
      $group: { 
       "_id": "$_id", 
       "name": { "$first": "$name" }, 
       "jobstatus" : { "$first": "$jobstatus" }, 
       "hourlyrate" : { "$first": "$hourlyrate" }, 
       "creatorparent" : { "$first" : "$creatorparent" }, 
       "children": { "$addToSet": "$children" } 
      } 
     }, 

    ] 
);