2014-02-13 91 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一些指針,以如何做才能改變你的結果的形狀的更多信息。