【问题标题】:Mongo query aggregate with a conditional group and another field带有条件组和另一个字段的 Mongo 查询聚合
【发布时间】:2019-01-02 21:26:14
【问题描述】:

我关注了@Blakes-Seven 的这篇文章 Mongodb aggregate $group for multiple date ranges

但我需要按字段“$User.Account”添加一个额外的组,但我不断收到错误消息。当我把它拿出来时它工作正常。

我正在尝试做的,我很确定下面不会做的是找到每个日期范围内的前 N ​​个用户...

{
    "message" : "the group aggregate field 'User' must be defined as an expression inside an object",
    "ok" : 0,
    "code" : 15951,
    "name" : "MongoError"
}

任何帮助将不胜感激。我错过了一些东西......

>     // work out dates somehow var today = new Date(),
>     oneDay = ( 1000 * 60 * 60 * 24 ),
>     ninetyDays = new Date( today.valueOf() - ( 90 * oneDay ) ),
>     sixtyDays = new Date( today.valueOf() - ( 60 * oneDay ) ),
>     thirtyDays = new Date( today.valueOf() - ( 30 * oneDay ) );
> 
> db.logs.aggregate([
>     { "$match": {
>         "DateTime": { "$gte": ninetyDays },
>         "Orgname": /Inc/
>     }},
>     { "$group": {
>         "_id": {
>             "$cond": [
>                 { "$lt": [ "$DateTime", sixtyDays ] },
>                 "61-90",
>                 { "$cond": [
>                     { "$lt": [ "$DateTime", thirtyDays ] },
>                     "31-60",
>                     "01-30"
>                 ]}
>             ]
>         },
>         "User": "$User.Account",
>         "count": { "$sum": 1 },
>     }},
>     {    $sort: {"count": -1}
>     },
>     { $limit: 25} ])

Sample output
01-30  usera 45
01-30  userc 34
01-30  userf 28
01-30  userq 13
… 20 more rows...
01-30  usery 4
31-60  userb 55
… 23 more rows
31-60  userk 3
61-90  userm 78
61-90  userf 45
... 22 more rows...

61-90  usery 22

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您可以按照以下语法在$group 表达式中添加另一个字段

    db.logs.aggregate([
      { "$match": {
        "DateTime": { "$gte": ninetyDays },
        "Orgname": /Inc/
      }},
      { "$group": {
        "_id": {
          "User": "$User.Account",
          "date": {
            "$cond": [
              { "$lt": [ "$DateTime", sixtyDays ] },
              "61-90",
              { "$cond": [
                { "$lt": [ "$DateTime", thirtyDays ] },
                "31-60",
                "01-30"
              ]}
            ]
          }
        },
        "count": { "$sum": 1 },
      }},
      { "$sort": { "count": -1 }},
      { "$limit": 25}
    ])
    

    【讨论】:

    • 感谢您回复我!我试过了,虽然我不再收到错误,但最终结果不是我想要的。我想在每天的存储桶中获得前 25 个结果。所以我最终应该有 75 行,而不仅仅是 25 行。我不确定我是否可以一次性完成。
    • 好的,那么请解释一下您需要什么。如果您显示一些样本集合和输出会更好
    • 我没有看到你通过将条件部分组合成一个组所做的细微变化!那改变了游戏规则。那么如何一次在一个组内进行排序和限制?非常感谢您的帮助!
    • 所以上面的查询现在可以工作了吗? 那么我如何一次在一个组内进行排序和限制?没有得到这个
    • 它工作得更好,但我似乎无法获得 75 行,每个日期类别中有 25 行。无论日期类别如何,我只得到前 25 名的 25 行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2019-05-06
    • 1970-01-01
    • 2015-01-31
    • 2021-01-11
    • 2018-08-16
    • 2021-02-06
    相关资源
    最近更新 更多