MongoDB:通过嵌套数组中的最新项查找文档

时间:2014-02-13 12:19:21

标签: mongodb mongodb-query

我有一个包含下一个结构的文档的集合:

 {
    "Id" : 123
    "History" : [ 
        {
            "MachineId" : 1,
            "Time" : ISODate("2014-02-10T13:10:00Z"),
            "Status" : 0
        }, 
        {
            "MachineId" : 1,
            "Time" : ISODate("2014-02-10T13:10:44Z"),
            "Status" : 1
        }, 
        {
            "MachineId" : 2,
            "Time" : ISODate("2014-02-10T13:10:50Z"),
            "Status" : 2
        }
    ]
},
{
    "Id" : 345
    "History" : [ 
        {
            "MachineId" : 1,
            "Time" : ISODate("2014-02-10T13:10:00Z"),
            "Status" : 0
        }, 
        {
            "MachineId" : 1,
            "Time" : ISODate("2014-02-10T13:10:44Z"),
            "Status" : 1
        }
    ]
}

我有输入 MachineId 状态,我想查找具有给定 MachineId 状态,但此项必须是最新项。

例如,对于 MachineId = 1 状态= 1 ,我只想获取 ID = 345

的文档

我知道如何查询嵌套数组元素,但在这里我首先需要对历史数组进行排序以查找最后添加的项目。我不知道如何在MongoDB中这样做。

2 个答案:

答案 0 :(得分:3)

既然你说你不知道如何处理这个问题,我会尽力引导你。这非常适合aggregation pipeline

db.history.aggregate([
    // Match the item you want while you can still use an index
    {$match: { "History.MachineId" : 1, "Id" : 345 } },

    // ** Denormalise ** the array entries for additional processing
    {$unwind: "$History" },

    // Order things so the last time is first
    {$sort: { "History.Time": -1 }},

    // Filter out the first item per document
    {$group: { _id: "$Id", Time: {$first: "$History.Time" } }}
])

如果您需要的信息多于返回的信息,那么您可以查看this question,了解如何更改结果的形状。

答案 1 :(得分:2)

你可以追加

.sort({"History.Time":-1}).limit(1)

查询。

如果这不符合您的要求,您可以使用aggregation framework,再次拥有$sort$limit链。