2014-02-13 1 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 
     } 
    ] 
} 

У меня есть вход MachineId и Статус и я хочу, чтобы найти все документы которые имеют вложенный элемент истории с данными MachineId и Статус, но этот предмет должен быть самым последним.

Например, для MachineId = 1 и Status = 1, я хочу получить только документ с Id = 345

Я знаю, как для запроса вложенных элементов массива, но здесь я должен первым для сортировки массива истории, чтобы найти последний добавленный элемент. Я не знаю, как это сделать в MongoDB.

ответ

2

Вы можете добавить

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

к вашему запросу.

Если это не соответствует вашим требованиям, вы можете использовать aggregation framework, снова имея цепочки $sort и $limit.

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 для некоторых указателей относительно того, что нужно сделать, чтобы изменить форму ваших результатов.