为了账号安全,请及时绑定邮箱和手机立即绑定

请问MongoDB:聚合框架:获取每个分组ID的最新文档

请问MongoDB:聚合框架:获取每个分组ID的最新文档

www说 2019-12-29 04:00:25
我想获取所有其他字段的每个工作站的最后一个文档:{        "_id" : ObjectId("535f5d074f075c37fff4cc74"),        "station" : "OR",        "t" : 86,        "dt" : ISODate("2014-04-29T08:02:57.165Z")}{        "_id" : ObjectId("535f5d114f075c37fff4cc75"),        "station" : "OR",        "t" : 82,        "dt" : ISODate("2014-04-29T08:02:57.165Z")}{        "_id" : ObjectId("535f5d364f075c37fff4cc76"),        "station" : "WA",        "t" : 79,        "dt" : ISODate("2014-04-29T08:02:57.165Z")}我需要有t站和每个站的最新dt。使用聚合框架:db.temperature.aggregate([{$sort:{"dt":1}},{$group:{"_id":"$station", result:{$last:"$dt"}, t:{$last:"$t"}}}])退货{        "result" : [                {                        "_id" : "WA",                        "result" : ISODate("2014-04-29T08:02:57.165Z"),                        "t" : 79                },                {                        "_id" : "OR",                        "result" : ISODate("2014-04-29T08:02:57.165Z"),                        "t" : 82                }        ],        "ok" : 1}这是最有效的方法吗?谢谢
查看完整描述

3 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

索引是您真正需要的:


db.temperature.ensureIndex({ 'station': 1, 'dt': 1 })

for s in db.temperature.distinct('station'):

    db.temperature.find({ station: s }).sort({ dt : -1 }).limit(1)

当然使用实际上对您的语言有效的任何语法。


编辑:您是对的,像这样的循环会导致每个站往返,这对几个站来说非常有用,而对于1000个站则不太好。不过,您仍然希望station + dt上的复合索引能够取降序排序的优点:


db.temperature.aggregate([

    { $sort: { station: 1, dt: -1 } },

    { $group: { _id: "$station", result: {$first:"$dt"}, t: {$first:"$t"} } }

])



查看完整回答
反对 回复 2020-01-07
?
守候你守候我

TA贡献1802条经验 获得超10个赞

至于您发布的聚合查询,我将确定您在dt上有一个索引:


db.temperature.ensureIndex({'dt': 1 })

这将确保聚合管道开始时的$ sort尽可能高效。


至于是否是最有效的获取数据的方法,与循环查询相比,这可能取决于您拥有多少数据点。首先,我认为使用“成千上万个站点”以及可能成千上万个数据点,聚合方法会更快。


但是,随着您添加越来越多的数据,一个问题是聚合查询将继续接触所有文档。随着您扩展到数百万或更多的文档,这将变得越来越昂贵。这种情况的一种方法是在$ sort之后添加$ limit以限制所考虑的文档总数。这有点hacky和不精确,但它将有助于限制需要访问的文档总数。



查看完整回答
反对 回复 2020-01-07
  • 3 回答
  • 0 关注
  • 736 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信