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

Mongodb 按具有子字段的唯一子字段返回最后一个文档,mongodb,Mongodb,我正在尝试获取集合中每个用户的最后一个文档,但无法成功检索该文档。我已经在其他帖子中查找过了,但找不到(例如,和) 我的问题是,我无法将字段作为对象返回(我是mongo新手,希望有办法) 我只能返回{title,body,username,avatar}等字段,而不是{title,body,user{username,avatar}} 我的收藏: [{ title: 'title 1', body: 'body 2', user: { username:

我正在尝试获取集合中每个用户的最后一个文档,但无法成功检索该文档。我已经在其他帖子中查找过了,但找不到(例如,和)

我的问题是,我无法将字段作为对象返回(我是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
函数?

如果要根据日期筛选数据,请在数据库中添加一个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"
             }
         },
      }
    }
])
当您搜索它时,总是从集合的最后一个获取数据,如果您想首先获取数据,则需要读取


如果要根据日期筛选数据,请选中“在数据库中添加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"
             }
         },
      }
    }
])
当您搜索它时,总是从集合的最后一个获取数据,如果您想首先获取数据,则需要读取


请勾选

当您说您希望获得收藏中每个用户的“最后一份”文档时,您指的是时间上的最后一份吗?最后一个是索引?您对“last”的定义是什么?对不起,这个定义将是时间的最后一个文档。我认为mongo创建的ObjectID已经编码了时间戳。所以这也行。最重要的部分是作为对象的返回字段。我想要一个包含另一个字典的字段,而不仅仅是一个字符串当你说你想获得集合中每个用户的“最后一个”文档时,你是说时间是指最后一个吗?最后一个是索引?您对“last”的定义是什么?对不起,这个定义将是时间的最后一个文档。我认为mongo创建的ObjectID已经编码了时间戳。所以这也行。最重要的部分是作为对象的返回字段。我想要一个包含另一个字典的字段,而不仅仅是字符串。我的问题不是筛选/排序。我希望返回一个包含对象的字段,而不是像您在那里看到的那样包含字符串的字段。例如:user:{username:{$first:$user.username},avatar:$user.avatar}我已经根据您的要求更新了我的答案。请检查并让我知道是否有错误。这将返回一个空数组。还有,为什么$project在那里起作用呢?实际上,它起作用了。。。我打错了什么。但我仍然对$1项目感到疑惑。谢谢项目只是删除_id文件,不需要到那个阶段,它只是选择阶段。我的问题不是筛选/排序。我希望返回一个包含对象的字段,而不是像您在那里看到的那样包含字符串的字段。例如:user:{username:{$first:$user.username},avatar:$user.avatar}我已经根据您的要求更新了我的答案。请检查并让我知道是否有错误。这将返回一个空数组。还有,为什么$project在那里起作用呢?实际上,它起作用了。。。我打错了什么。但我仍然对$1项目感到疑惑。谢谢项目只是删除_id文件,不需要那个阶段,它只是选择阶段