我有一个这样的收藏集:
{
"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
首先,然后为每个集合获取最大为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 有人可以帮忙吗?谢谢。
答案 0 :(得分:0)
您共享的错误很可能与您的环境或执行代码的方式有关。逐行执行代码,您会发现环境中的问题。
您的查询是正确的。您可能需要对printjson(eachDoc.config...
行进行一些空检查,但这与收到的错误无关。