如果我有user
和post
集合
{"_id": 1, "name": "User 1"}
{"_id": 2, "name": "User 2"}
{"_id": 1, "title": "Post 1", "userId": 1, "createdAt": ISODate("2017-07-24T04:12:54.255Z")}
{"_id": 2, "title": "Post 2", "userId": 1, "createdAt": ISODate("2017-07-25T04:12:54.255Z")}
{"_id": 3, "title": "Post 1", "userId": 2, "createdAt": ISODate("2017-07-24T04:12:54.255Z")}
如何列出所有用户的最新帖子?会像
{
"_id": 1,
"name": "User 1",
"post": {
"_id": 2,
"title": "Post 2",
"userId": 1,
"createdAt": ISODate("2017-07-25T04:12:54.255Z")
}
}
我知道我可以轻松地使用$ lookup,$ unwind post,然后$ sort by post.createdAt,但这会让我留下冗余用户(用户1将在Post 1和Post 2中列出两次)。
我不知道如何使用$ group删除重复项,同时保持其他字段(名称,post.title等)
答案 0 :(得分:10)
我使用$ group和$ first
解决了重复项db.getCollection('user').aggregate([
{$lookup: {from: "post", localField: "_id", foreignField: "userId", as: "post"}},
{$unwind: { path: "$post", preserveNullAndEmptyArrays: true }},
{$sort: {"post.createdAt": -1}},
{$group: {"_id": "$_id", "name": {$first: "$name"}, "post": {$first: "$post"}},
{$project: {"_id": 1, "name": 1, post": 1}}
])
随意发布您的答案
答案 1 :(得分:2)
您可以使用新的$lookup语法在一个聚合步骤中解决此问题
db.getCollection('users').aggregate([{
'$lookup': {
'from': 'posts',
'let': {
'userId': '$_id'
},
'pipeline': [{
'$match': { '$expr': { '$eq': ['$userId', '$$userId'] } }
}, {
'$sort': { 'createdAt': -1 }
}, {
'$limit': 10
},
],
'as': 'posts'
}
}
])
注意:未经测试的代码,但原理应明确。
答案 2 :(得分:0)
这是一种使用方式
db.getCollection('post').aggregate([
{ $limit: 10 },
{$sort: {"createdAt": -1}},
{$lookup: {from: "user", localField: "userId", foreignField: "_id", as: "user"}},
])
您应该查询按日期排序的帖子,并与用户一起加入。因此,如果您想限制帖子数量,则可以。