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

我想获取所有其他字段的每个工作站的最后一个文档:


{

        "_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

}

这是最有效的方法吗?


谢谢


www说
浏览 742回答 3
3回答

慕姐4208626

索引是您真正需要的: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"} } }])

守候你守候我

至于您发布的聚合查询,我将确定您在dt上有一个索引:db.temperature.ensureIndex({'dt': 1 })这将确保聚合管道开始时的$ sort尽可能高效。至于是否是最有效的获取数据的方法,与循环查询相比,这可能取决于您拥有多少数据点。首先,我认为使用“成千上万个站点”以及可能成千上万个数据点,聚合方法会更快。但是,随着您添加越来越多的数据,一个问题是聚合查询将继续接触所有文档。随着您扩展到数百万或更多的文档,这将变得越来越昂贵。这种情况的一种方法是在$ sort之后添加$ limit以限制所考虑的文档总数。这有点hacky和不精确,但它将有助于限制需要访问的文档总数。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

MongoDB