【问题标题】:Not Duplicate :: How to sort and filter inside a groupby in mongoDB不重复 :: 如何在 mongoDB 中对组内进行排序和过滤
【发布时间】:2019-10-18 11:52:38
【问题描述】:

我有一个这样的收藏:

{
"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
}

我想groupbydocument_id 1st,然后为每个集合获取最大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
    }

为什么其他问题的答案不能解决我的问题: 在另一个问题中,只需要一个简单的 groupby 和 count 。

但是在这里我们必须先分组,然后对每个分组的部分应用排序并选择具有最新日期的部分,然后应用过滤器。据我所知,我们不能在组内使用排序。

我试过这个:

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

【问题讨论】:

  • @Ashh 你能解释一下这与你提到的那个重复吗?

标签: mongodb nosql mongodb-query aggregation-framework


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2019-05-30
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2015-10-02
    • 1970-01-01
    相关资源
    最近更新 更多