2014-02-13 58 views
1

我用一个结构文档的集合:的MongoDB:嵌套数组内查找最近的项目文件

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

我有一个输入机号状态,我想找到的所有文件具有给定机器标识状态的嵌套历史项目,但是此项目必须是最新的项目。

例如,对于设备ID = 1状态= 1,我想标识只得到文件= 345

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

回答

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一些指针,以如何做才能改变你的结果的形状的更多信息。