我正在尝试获取集合中每个用户的最新文档,但是我无法成功检索到该文档。我已经看过其他帖子,但找不到(例如mongo group query how to keep fields和MongoDB : Aggregation framework : Get last dated document per grouping ID)
我的问题是我显然无法返回字段作为对象(我是mongo的新手,所以我希望有办法)。
我只能返回{title,body,username,avatar}之类的字段,而不是{title,body,user {username,avatar}}
我的收藏集:
[{
title: 'title 1',
body: 'body 2',
user: {
username: 'a',
avatar: 'avatar 1'
}
},
{
title: 'title 2',
body: 'body 2',
user: {
username: 'b',
avatar: 'avatar 2'
}
},
{
title: 'title 3',
body: 'body 3',
user: {
username: 'b',
avatar: 'avatar 2'
}
}]
我想在分组之后返回:
[{
title: 'title 1',
body: 'body 2',
user: {
username: 'a',
avatar: 'avatar 1'
}
},
{
title: 'title 3',
body: 'body 3',
user: {
username: 'b',
avatar: 'avatar 2'
}
}]
我尝试过的查询之一的示例:
// this only returns the avatar and not the username...
db.collection.aggregate([
{ '$sort': { title: 1 } },
{ '$group': {
_id: '$user.username',
body: { $last: '$body' },
title: { $last: '$title' },
user: { $last: '$user.username', $last: '$user.avatar' }
}}])
// this throws an error saying the field 'user ' must be an accumulator object
db.collection.aggregate([
{ '$sort': { title: 1 } },
{ '$group': {
_id: '$user.username',
body: { $last: '$body' },
user: [ { $last: '$user.username', $last: '$user.avatar' } ]
}}
])
话虽如此,我也想指出,也许不是小组的路。也许mongo有一个我可以使用的distinct
函数?
答案 0 :(得分:2)
如果要基于日期过滤数据,请在数据库中添加一个createdAt字段作为时间戳
db.collection.aggregate([
{ "$sort": { "createdAt": 1 } },
{
"$group": {
_id: "$user.username",
body: { $last: "$body" },
title: { $last: "$title" },
user: {
$first: {
username: "$user.username",
avater: "$user.avatar"
}
},
}
}
])
搜索时,如果要先获取,则总是从集合的最后获取数据,您需要阅读$natural
请检查here