У меня есть такая коллекция:
{
"document_id": "firstDoc",
"date_changed" : ISODate("2017-07-26T17:52:37.061Z"),
"enabled": false
},
{
"document_id": "firstDoc",
"date_changed" : ISODate("2018-07-26T17:52:37.061Z"),
"enabled": true
},
{
"document_id": "secondDoc",
"date_changed" : ISODate("2017-07-26T17:52:37.061Z"),
"enabled": true
},
{
"document_id": "secondDoc",
"date_changed" : ISODate("2018-07-26T17:52:37.061Z"),
"enabled": true
}
Я хочу groupby
document_id
1-й, затем для каждого набора получите документ с максимальным значением date_changed
, а затем отфильтруйте документ "enabled": true
Таким образом, ожидаемый результат:
{
"document_id": "secondDoc",
"date_changed" : ISODate("2018-07-26T17:52:37.061Z"),
"enabled": true
},
{
"document_id": "firstDoc",
"date_changed" : ISODate("2018-07-26T17:52:37.061Z"),
"enabled": true
}
Почему ответ на другой вопрос не может решить мою проблему: В другом вопросе требуется только простая группировка и подсчет.
Но здесь мы сначала должны сгруппировать, затем применить сортировку для каждого сгруппированного раздела и выбрать тот, который имеет самую последнюю дату, а затем применить фильтр. Насколько я знаю, мы не можем использовать сортировку внутри группы.
Я пробовал это:
var myCursor = db.configurations.aggregate([
{$group: {'_id':'$document_id',
'date':{$max: 'date_changed'}
}
}
]);
while (myCursor.hasNext()) {
var eachDoc = myCursor.next();
printjson(eachDoc.config.booknow.shoppingList.enabled);
printjson(eachDoc.document_id);
}
Но выдает ошибку: TypeError: myCursor.hasNext is not a function (shell):1
БД версия 2.4.13 Кто-нибудь может помочь? Спасибо.