如何在mongodb中找到具有最大字段值的文档?

时间:2014-07-24 15:25:44

标签: mongodb mapreduce aggregation-framework

我有许多以下形式的Mongodb文档:

{
    "auditedId" : "53d0f648e4b064e8d746b31c",
    "modifications" : [
        {
            "auditRecordId" : ObjectId("53d0f648e4b064e8d746b31d"),
            "modified" : "2014-07-22 18:33:05"
        },
        {
            "auditRecordId" : ObjectId("53d0f648e4b064e8d746b31e"),
            "modified" : "2014-07-24 14:15:27"
        },
        {
            "auditRecordId" : ObjectId("53d0f648e4b064e8d746b31f"),
            "modified" : "2014-07-24 12:04:24"
        }
    ]
}

对于这些文档中的每一个,我想找到对应于最新修改的“auditRecordId”值。在给定的示例中,我想要检索

"auditRecordId" : ObjectId("53d0f648e4b064e8d746b31e")

或者,甚至更好:

{
    "auditRecordId" : ObjectId("53d0f648e4b064e8d746b31e"),
    "modified" : "2014-07-24 14:15:27"
}

如果不编写map-reduce函数,我有什么方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:2)

每当文档中有数组时,aggregate方法就是你的朋友:)

db.foo.aggregate([
    // De-normalize the 'modifications' array
    {"$unwind":"$modifications"}, 
    // Sort by 'modifications.modified' descending
    {"$sort":{"modifications.modified":-1}}, 
    // Pick the first one i.e., the max
    {"$limit":1}
])

输出:

{
        "result" : [
                {
                        "_id" : ObjectId("53d12be57a462c7459b6f1c7"),
                        "auditedId" : "53d0f648e4b064e8d746b31c",
                        "modifications" : {
                                "auditRecordId" : ObjectId("53d0f648e4b064e8d746b31e"),
                                "modified" : "2014-07-24 14:15:27"
                        }
                }
        ],
        "ok" : 1
}

为了说明$unwind运算符,我将上述查询用于$limit。如果您有多个上述格式的文档,并且想要检索每个文档中的最新修改,则必须在聚合管道中添加另一个$group阶段并使用$first运算符:

db.foo.aggregate([
    {"$unwind":"$modifications"}, 
    {"$sort":{"modifications.modified":-1}}, 
    {"$group":{
        "_id" : "$auditedId", 
        "modifications" : {$first:"$modifications"}}}
])