如何根据它们与整个集合的比较结果提取整个文档?

时间:2019-04-22 16:01:46

标签: 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查询获得所需的输出?

1 个答案:

答案 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