Как запросить только документы с последней отметкой времени из группы?
В коллекции MongoDB, к которой я обращаюсь, каждый документ представляет элемент в определенное время. При обновлении документа создается новый документ с тем же идентификатором элемента и новой отметкой времени. Все предметы имеют уникальные идентификаторы.
Для иллюстрации рассмотрим этот пример. Мы начинаем с одной ревизии элемента:
{
_id: x,
itemId: 123,
createdOn: ISODate("2013-01-30T11:16:20.102Z"),
field1: "foo",
field2: "bar
}
После обновления у нас есть две ревизии элемента, с одинаковымиItemid и разные временные метки.
[{
_id: x,
itemId: 123,
createdOn: ISODate("2013-01-30T11:16:20.102Z"),
field1: "foo",
field2: "bar"
},
{
_id: y,
itemId: 123,
createdOn: ISODate("2014-02-09T14:26:20.102Z"),
field1: "baz",
field2: "fiz"
}]
Как я могу найти все элементы, которые в их последней редакции удовлетворяют определенному запросу?
Мой текущий (неправильный) подход заключается в том, чтобы сначала найти соответствующие документы, а затем отсортировать по отметке времени, сгруппировать их поItemidи вернуть значения из первого документа в группе:
ItemModel.aggregate({ $match: { field1: "foo"} }).sort({createdOn: -1}).group(
{
_id: '$itemId', // grouping key
createdOn: {$first: '$createdOn'},
field1: {$first: '$field1'},
field2: {$first: '$field2'}
}).exec(...);
Это неправильно, потому что это соответствует старым версиям предметов. Только последние версии предметов должны совпадать. В приведенном выше примере этот подход возвращает элемент «123», в то время как правильный результат - пустой набор результатов.