我正在try 先按日期排序数据,然后在另一个字段上分组.

The question I am trying to answer is: Select the most recent distinct cid?

鉴于这些数据:

db.summary.save({"lid" : 5, "date" : 5, "cid" : 2, "circles" : [ 2 ] })
db.summary.save({"lid" : 2, "date" : 2, "cid" : 1, "circles" : [ 2 ] })
db.summary.save({"lid" : 4, "date" : 0, "cid" : 3, "circles" : [ 2 ] })
db.summary.save({"lid" : 3, "date" : 3, "cid" : 2, "circles" : [ 2 ] })
db.summary.save({"lid" : 1, "date" : 1, "cid" : 1, "circles" : [ 2 ] })

db.summary.aggregate( {$match :{circles: 2}, $sort: {date: -1}, $group: {_id: '$cid'}} )

我先在圆圈上做一场比赛,

我得到的结果是:

{
    "result" : [
        {
            "_id" : 3
        },
        {
            "_id" : 1
        },
        {
            "_id" : 2
        }
    ],
    "ok" : 1
}

Here is my analysis:

在按日期进行匹配或排序之前,数据为:

"lid" : 5, "date" : 5, "cid" : 2
"lid" : 2, "date" : 2, "cid" : 1
"lid" : 4, "date" : 0, "cid" : 3
"lid" : 3, "date" : 3, "cid" : 2
"lid" : 1, "date" : 1, "cid" : 1

按日期排序后,数据集将为:

"lid" : 5, "date" : 5, "cid" : 2
"lid" : 3, "date" : 3, "cid" : 2
"lid" : 2, "date" : 2, "cid" : 1 
"lid" : 1, "date" : 1, "cid" : 1
"lid" : 4, "date" : 0, "cid" : 3

所以分组后,我预期的结果是:

{
    "result" : [
        {
            "_id" : 2
        },
        {
            "_id" : 1
        },
        {
            "_id" : 3
        }
    ],
    "ok" : 1
}

什么问题解决了我的问题?

为什么当前的查询对我不起作用?

推荐答案

当您在管道中输入$sort后输入$group时,上一个排序将丢失.您必须这样做,以便在分组后可以使用您想要排序的日期:

db.summary.aggregate(
    {$match: {circles: 2}},
    {$group: {_id: '$cid', date: {$max: '$date'}}},
    {$sort: {date: -1}});

结果:

[ { _id: 2, date: 5 }, 
  { _id: 1, date: 2 }, 
  { _id: 3, date: 0 } ]

如果要reshape 输出,请在管道末端添加$project.

Mongodb相关问答推荐

通过mongoDB中的查找从管道中删除被阻止的用户

MongoDB更新对象数组

没有文档的MongoDB集合中的不一致,但当我执行count()时,它告诉我有15个文档

在mongo聚合管道的组阶段排除字段,但在最后将其包含在内

如何在 mongodb 查找的外键中使用正则表达式

使用 mongo-driver/mongo 使用键/值对中的值表达式查找文档

MongoDb 聚合未正确分组

Raft Vs MongoDB 初选

在mongo聚合中将ObjectID转换为字符串

SELECT 字段 AS `anothername` 的 mongodb 等效项

mongodb 模式设计命名约定

在 Nodejs 中找不到模块

MongoDB 1.6.5:如何重命名集合中的字段

在 Ubuntu 14.04 中安装 MongoDB 失败

`fields cannot be identical'和''` mongoimport错误

是否有适用于 Linux 的 MongoDB GUI 桌面应用程序?

Mongoose 是否真的验证了对象 ID 的存在?

Mongodb 设计,嵌入与关系

聚合 $lookup 匹配管道中文档的总大小超过最大文档大小

从 Grunt 任务中启动 MongoDB