我正在尝试从“稀疏”集合中提取最新的每日可用度量,这些集合可能没有每天的度量。我有兴趣获取整个原始文档作为输出。该集合包含一系列由唯一ID标识的测量值。
例如,给定以下集合:
{ "date" : "2019-04-10", "id" : 1, "measurement" : 50 }
{ "date" : "2019-04-10", "id" : 2, "measurement" : 1 }
{ "date" : "2019-04-10", "id" : 3, "measurement" : 33 }
{ "date" : "2019-04-11", "id" : 1, "measurement" : 52 }
{ "date" : "2019-04-11", "id" : 3, "measurement" : 3 }
{ "date" : "2019-04-12", "id" : 1, "measurement" : 55 }
{ "date" : "2019-04-12", "id" : 2, "measurement" : 12 }
以上集合包含3个ID的测量值。我想获取每个ID的最新测量值。
例如,上述集合应产生以下结果:
{ "date" : "2019-04-12", "id" : 1, "measurement" : 55 }
{ "date" : "2019-04-12", "id" : 2, "measurement" : 12 }
{ "date" : "2019-04-11", "id" : 3, "measurement" : 3 }
到目前为止,我可以使用以下方法提取每个ID的最新日期:
db.control_subs.aggregate([ { $group : { _id : "$id", "last_date" : { $max : "$date" } } }, { $sort:{ "_id": 1 }} ])
但是,不幸的是,这会从输出中剥离实际的measurement
字段。
如何通过单个MongoDB查询获得所需的输出?
答案 0 :(得分:0)
您可以使用aggregation
运算符尝试以下$$ROOT
查询:
db.control_subs.aggregate([
{
"$project":
{
"id": "$id",
"date": "$date",
"document": "$$ROOT" // save all fields for future usage
}
},
{
"$sort":
{ "date": -1
}
},
{
"$group":
{
"_id":{"id":"$id"},
"original_doc":{"$first":"$document"}
}
},
{
$project:
{
"original_doc.date":1, "original_doc.id":1, "original_doc.measurement":1, _id:0}
}
])
以上汇总的输出为
{ "original_doc" : { "date" : "2019-04-11", "id" : 3, "measurement" : 3 } }
{ "original_doc" : { "date" : "2019-04-12", "id" : 2, "measurement" : 12 } }
{ "original_doc" : { "date" : "2019-04-12", "id" : 1, "measurement" : 55 } }
即使您也可以在$replaceRoot的帮助下替换original_doc