我有一个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
字段只包含一个引用。
提前致谢
答案 0 :(得分:1)
聚合并不是那么简单,所以你应该考虑将这两个字段嵌入你的数组中(也是因为潜在的性能问题)。但是,您需要做的是:
使用$ 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"}
}
}
])