我有一个包含下一个结构的文档的集合:
{
"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中这样做。
答案 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链。