mongodb - 我如何根据它们与整个集合的比较来提取整个文档?

标签 mongodb mongodb-query

我正在尝试从可能没有每天的测量值的“稀疏”集合中提取最新的可用每日测量值。我有兴趣将整个原始文档作为输出。该集合包含多个由唯一 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/

相关文章:

MongoDB 按数组大小对大量文档进行排序

python - 在 mongoDB 中插入 UTF-8 json 是不可能的 : "Failed: error processing document #1: invalid character ' x' in string escape code"

python - 如何在Python脚本中编写查询

java - 如何使用 Java 对 MongoDB 中的文档进行批量更新?

mongodb - 使用另一个查询的结果在 MongoDB 中查找文档

javascript - 无法使用 Mongoose 将对象添加到 mongodb 中的数组中?

MongoDB:如何获取数组中特定子字段及其后续字段的值?

javascript - 使用 node.js 驱动程序将 Mongo 集合导出到 json

javascript - 获取 mongo shell BinData 作为字符串

javascript - 使用用户帐户登录 MongoDB