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



我有以下形式的一些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函数?

当你有一个数组在你的文档,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"}}}
])

相关内容

  • 没有找到相关文章

最新更新