【问题标题】:How do I do a multi tier count breakdown using Aggregation in mongo DB?如何在 mongoDB 中使用聚合进行多层计数细分?
【发布时间】:2020-03-29 10:24:06
【问题描述】:

我有一个如下结构的文档。

{
  name: "John Doe",
  City : "OK",
  Prepaid: "Y"
},
{
  name: "Jane Doe",
  City : "CA",
  Prepaid: "N"
},
{
  name: "Jule Doe",
  City : "OK",
  Prepaid: "N"
},
{
  name: "Jake Doe",
  City : "OK",
  Prepaid: "Y"
}

我想先根据城市对它进行分组,然后再对预付费进行分组,然后分别获取每种预付费类型的计数。看起来与此类似的东西。

{
  City : OK
  Count : {
    "filter": prepaid,
    "count": {
      Y : 2
      N: 1
    }
  }
}

{
  City : CA
  Count : {
    "filter": prepaid,
    "count": {
      Y : 0
      N: 1
    }
  }
}

我尝试基于多个字段进行聚合,它给了我文档的总数,而不是细分。

这是我为聚合管道尝试的:

db.collection.aggregate([
    {$match:matchquery
    },{$group:{_id:{city: '$city', prepaid: '$prepaid' }, count:{$sum:1}
    }}
])

【问题讨论】:

    标签: javascript mongodb aggregation-framework


    【解决方案1】:

    您可以先运行$group 两次以通过prepaid 计数,然后您可以应用$arrayToObject 以获取Y/N 作为对象键:

    db.collection.aggregate([
        {
            $group: {
                _id: { city: "$City", prepaid: "$Prepaid" },
                total: { $sum: 1 }
            }
        },
        {
            $grop: {
                _id: "$_id.city",
                Count: {
                    $push: {
                        k: "$_id.prepaid", v: "$total"
                    }
                }
            }
        },
        {
            $project: {
                _id: 0,
                city: "$_id",
                Count: { $mergeObjects: [ { filter: "prepaid" }, { count: { $arrayToObject: "$Count" } } ] }
            }
        }
    ])
    

    Mongo Playground

    【讨论】:

    • 这很有帮助。我还有一个问题,如果我有这些临时的多个组参数,有没有办法可以将它们全部嵌套在一起?
    • @sajakupadhyaya 我不确定我是否理解,你能举个例子吗?
    • 所以我的用例基本上是用户使用他们选择的过滤器向后端发送临时查询。该文件有更多的属性,如收入、租金、种族等。因此用户可以发送租金和种族等过滤器,而不是上面提到的预付和城市。因此,必须发送聚合查询的代码不确定它作为分组参数得到了什么。
    • @sajakupadhyaya 我认为最好打开另一个问题并举例说明
    猜你喜欢
    • 2019-05-19
    • 2020-09-15
    • 2019-01-31
    • 2018-06-26
    • 1970-01-01
    • 2018-01-16
    • 2020-11-16
    • 2020-12-29
    • 2012-10-25
    相关资源
    最近更新 更多