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

3

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

 {
    "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
        }
    ]
}

我有一个输入项MachineIdStatus,我想找到所有具有给定的MachineIdStatus嵌套历史项的文档,但是此项必须是最新的。
例如,对于MachineId=1Status=1,我只想获取Id=345的文档。
我知道如何查询嵌套数组元素,但在这里,我需要首先对历史记录数组进行排序以找到最后添加的项。我不知道如何在MongoDB中实现这一点。
2个回答

5

既然您说不知道如何处理这个问题,我会试着带您走过来。这非常适合使用聚合管道

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" } }}
])

如果您需要更多的信息,而返回的信息不足以满足您的需求,那么您可以查看这个问题来获取一些指针,以便修改结果的形状。


2
您可以添加
.sort({"History.Time":-1}).limit(1)

对于您的查询,如果这不符合您的要求,您可以使用聚合框架,再次使用$sort$limit链。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接