如何选择按条件筛选的最新(按日期)文档(MongoDB)

时间:2017-10-09 14:02:10

标签: mongodb

给出示例集合:

{ "_id" : ObjectId("59db7bd22f02828b587ca88a"), "date" : ISODate("2014-01-01T07:00:00Z"), "sensor" : "sensor1", "metric" : 10 }
{ "_id" : ObjectId("59db7bd22f02828b587ca88b"), "date" : ISODate("2014-01-01T07:01:00Z"), "sensor" : "sensor1", "metric" : 11 }
{ "_id" : ObjectId("59db7bd22f02828b587ca88c"), "date" : ISODate("2014-01-01T07:02:00Z"), "sensor" : "sensor1", "metric" : 12 }
{ "_id" : ObjectId("59db7bd22f02828b587ca88d"), "date" : ISODate("2014-01-01T07:03:00Z"), "sensor" : "sensor2", "metric" : 20 }
{ "_id" : ObjectId("59db7bd22f02828b587ca88e"), "date" : ISODate("2014-01-01T07:04:00Z"), "sensor" : "sensor2", "metric" : 21 }

我正在构建一个返回以下内容的查询:(假设我可以注入一组传感器。例如{ $in: ["sensor1", "sensor2"] }

{ "_id" : ObjectId("59db7bd22f02828b587ca88c"), "date" : ISODate("2014-01-01T07:02:00Z"), "sensor" : "sensor1", "metric" : 12 }
{ "_id" : ObjectId("59db7bd22f02828b587ca88e"), "date" : ISODate("2014-01-01T07:04:00Z"), "sensor" : "sensor2", "metric" : 21 }

这两个文件代表每个sensor的最新文件。我可以用两个查询来做,每个传感器一个:

db.readings.find({"sensor": "sensor1"}).sort({date: -1}).limit(1)
db.readings.find({"sensor": "sensor2"}).sort({date: -1}).limit(1)

但我想了解它是否可以作为一个查询完成。同样,我可以获得的唯一数据是传感器组。虽然上面的示例查询仅限于返回一个文档,但理想情况下我想要求n个读数,因此每个传感器中返回的文档集始终为n

更新

我可以使用下面评论中提到的聚合框架,但我只能得到一个。即。{$first:"$$ROOT"}。我想获得n个文档,因此类似{$push:"$$ROOT", $limit:2}的内容会很棒,但这并不存在。还有其他选择吗?

0 个答案:

没有答案