不可重复::如何在mongoDB中的分组依据中进行排序和过滤

时间:2019-10-18 11:52:38

标签: mongodb nosql mongodb-query aggregation-framework

我有一个这样的收藏集:

{
"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 有人可以帮忙吗?谢谢。

1 个答案:

答案 0 :(得分:0)

您共享的错误很可能与您的环境或执行代码的方式有关。逐行执行代码,您会发现环境中的问题。

您的查询是正确的。您可能需要对printjson(eachDoc.config...行进行一些空检查,但这与收到的错误无关。