返回具有子字段的每个唯一子字段的最后一个文档

时间:2019-04-19 01:54:55

标签: mongodb

我正在尝试获取集合中每个用户的最新文档,但是我无法成功检索到该文档。我已经看过其他帖子,但找不到(例如mongo group query how to keep fieldsMongoDB : 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函数?

1 个答案:

答案 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