3 回答
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"} } }
])
TA贡献1802条经验 获得超10个赞
至于您发布的聚合查询,我将确定您在dt上有一个索引:
db.temperature.ensureIndex({'dt': 1 })
这将确保聚合管道开始时的$ sort尽可能高效。
至于是否是最有效的获取数据的方法,与循环查询相比,这可能取决于您拥有多少数据点。首先,我认为使用“成千上万个站点”以及可能成千上万个数据点,聚合方法会更快。
但是,随着您添加越来越多的数据,一个问题是聚合查询将继续接触所有文档。随着您扩展到数百万或更多的文档,这将变得越来越昂贵。这种情况的一种方法是在$ sort之后添加$ limit以限制所考虑的文档总数。这有点hacky和不精确,但它将有助于限制需要访问的文档总数。
- 3 回答
- 0 关注
- 792 浏览
添加回答
举报