mongodb,从数组中获取相关文档

时间:2017-11-20 20:21:23

标签: mongodb reference

我有一个Event集合,其中可能包含以下内容:

{ "_id" : ObjectId("5a12fa490eeff735737e7711"), 
  "title" : "dgdfgfgfd", 
  "startDate" : ISODate("2017-11-20T15:52:33.060Z"), 
  "endDate" : ISODate("2017-11-20T16:52:33.060Z"), 
  "registrations" : [ ObjectId("5a0c0c5ea8c2405f092fc83d") ] 
}
{ 
  "_id" : ObjectId("5a12ffbed7a6043de1ba7d72"), 
  "title" : "kjkj", 
  "startDate" : ISODate("2017-11-20T16:15:54.204Z"), 
  "endDate" : ISODate("2017-11-20T16:15:54.204Z"), 
  "registrations" : [ ObjectId("5a0c0c5ea8c2405f092fc83d"), ObjectId("7a0c0c5ea8dfd05f092fc84d") ]
}

registration字段包含一组用户ID。

如何获取registrations中为给定事件引用的所有用户的列表?

例如,对于_id 5a12fa490eeff735737e7711的事件,我想最终得到一个如下所示的用户列表:

[
  {
    "_id" : ObjectId("5a0c0c5ea8c2405f092fc83d"), 
    "name" : "test user"
    "email" : "m@m.fr"
  }
]

在这种情况下,结果列表中只有一个元素,因为给定事件的registrations字段只包含一个引用。

提前致谢

1 个答案:

答案 0 :(得分:1)

聚合并不是那么简单,所以你应该考虑将这两个字段嵌入你的数组中(也是因为潜在的性能问题)。但是,您需要做的是:

  • 展开注册
  • 使用$ lookup连接第二个集合中的数据
  • 使用$ project来分解您的文档,以便注册ID和用户数据将成为一个子文档
  • 使用$ group获取注册数组

    db.Event.aggregate([
       {
           "$unwind": "$registrations"
       },
       {
          "$lookup": {
             "from": "Users",
             "localField": "registrations",
             "foreignField": "_id",
             "as" : "user"
             }
       },
       {
          "$project": {
             "_id": 1,
             "title" : 1,
             "startDate" : 1,
             "endDate": 1,
             "registrations._id": "registrations",
             "registrations.name": "user.name",
             "registrations.email": "user.email" 
           }
       },
       {
          "$group": {
              "_id": "$_id",
              "title" : { "$first": "$title"},
              "startDate" : { "$first": "$startDate"}, 
              "endDate" : { "$first": "$endDate"},
              "registrations": { "$push": "$registrations"}
           }
        }
    

    ])