我正在尝试从可能没有每天的测量值的“稀疏”集合中提取最新的可用每日测量值。我有兴趣将整个原始文档作为输出。该集合包含多个由唯一 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 查询获得所需的输出?
最佳答案
您可以尝试使用 $$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
关于mongodb - 我如何根据它们与整个集合的比较来提取整个文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55797275/