【发布时间】:2020-10-01 22:54:04
【问题描述】:
我们来看一个名为values 的集合,其中包含以下文档。
{ "_id" : 1, "name" : "value1", "date" : ISODate("2020-02-06T15:20:13Z"), "x" : 1, "y" : 2 }
{ "_id" : 2, "name" : "value1", "date" : ISODate("2020-02-06T16:20:13Z"), "x" : 3, "y" : 3 }
{ "_id" : 3, "name" : "value1", "date" : ISODate("2020-02-06T17:20:13Z"), "x" : 3, "y" : 4 }
{ "_id" : 4, "name" : "value2", "date" : ISODate("2020-02-06T16:20:13Z"), "x" : 10, "y" : 20 }
{ "_id" : 5, "name" : "value2", "date" : ISODate("2020-02-06T17:20:13Z"), "x" : 20, "y" : 30 }
{ "_id" : 6, "name" : "value2", "date" : ISODate("2020-02-06T18:20:13Z"), "x" : 10, "y" : 40 }
在这里,如果我按name 分组,那么我应该得到每个组的最新文档(基于date)。所以,我应该得到以下文件。
{ "name" : "value1", "x" : 3, "y" : 4 }
{ "name" : "value2", "x" : 10, "y" : 40 }
我可以先根据date 对文档进行降序排序,然后在$group 中使用$first 运算符来获取文档。但是,我认为这可能由于排序而效率低下,因为它会对整个集合进行排序以获得最后一个值(我可能错了)。
有没有更好的方法来有效地做到这一点?
(注意:date 没有唯一值)
【问题讨论】:
-
在
$group中使用$max 聚合运算符来获取分组的最新日期。 -
$max用于date字段?您的意思是在$match中这样做吗? -
是
$max应用于日期字段。像这样:{ $group: { _id: "$name", date: { $max: "$date" } } },而不是排序,然后在小组赛中应用 $first。 -
您不能使用
$max运算符,因为它会检查所有字段是否大于其他字段...在您当前的示例中$max可以工作,但它会为许多其他名称返回错误结果 -
@Valijon 所以
$max实际上会占据所有date中最高的name?如果是这样的话,我们就不能那样使用它了。
标签: mongodb mongodb-query aggregation-framework