如何在mongodb中按多列和多个值分组

node_saini

Mongodb集合-

[
{ name: 'name 1', call: 'Success Call' },
{ name: 'name 1', call: 'Repeat Call' },
{ name: 'name 3', call: 'Repeat Call' },
{ name: 'name 3', call: 'Unsuccess Call' }
{ name: 'name 2', call: 'Success Call' },
{ name: 'name 2', call: 'Repeat Call' }
{ name: 'name 2', call: 'Repeat Call' }
{ name: 'name 2', call: 'Unsuccess Call' }
.
.
.
.
]

我遵循了此链接组并使用聚合框架对多列求和,最后得到了此输出。

[
{
    "_id": 1,
    "Calls": [
        {
            "call": "Repeat Call",
            "callCount": 2
        },
        {
            "call": "Unsuccess Call",
            "callCount": 1
        },
        {
            "call": "Success Call",
            "callCount": 1
        }
    ],
    "Names": [
        {
            "name": {
                "name": "name 4"
            },
            "nameCount": 1
        },
        {
            "name": {
                "name": "name 3"
            },
            "nameCount": 1
        },
        {
            "name": {
                "name": "name 1"
            },
            "nameCount": 2
        }
    ]
}
]

而我实际上需要这样的东西

[
{
    "name": "name 4",
    "nameCount": 1,
    "Success Call":1,
    "Unsuccess Call":0,
    "Repeat Call":0
},
{
    "name": "name 3",
    "nameCount": 1,
    "Success Call":2,
    "Unsuccess Call":3,
    "Repeat Call":1
},
{
    "name": "name 1",
    "nameCount": 2,
    "Success Call":1,
    "Unsuccess Call":1,
    "Repeat Call":1
}
]

谁能帮我解决这个问题?提前致谢!

克列丹

在聚合管道中,对于MongoDB 3.6版及更高版本,您可以利用$arrayToObject运算符和$replaceRoot管道的使用来获取所需的JSON输出。这对于调用字段的未知值非常有效。

您将需要运行以下聚合管道:

db.collection.aggregate([
    { "$group": {
        "_id": { 
            "name": "$name",
            "call": "$call"
        },
        "count": { "$sum": 1 }
    } },
    { "$group": {
        "_id": "$_id.name",
        "counts": {
            "$push": {
                "k": "$_id.call",
                "v": "$count"
            }
        },
        "nameCount": { "$sum": 1 }
    } },
    { "$replaceRoot": { 
        "newRoot": { 
            "$mergeObjects": [ 
                { "$arrayToObject": "$counts" }, 
                "$$ROOT" 
             ] 
        } 
    } },
    { "$project": { "counts": 0 } }
])

对于不支持上述运算符的早期MongoDB版本,请$cond$group阶段利用运算符根据已知call评估计数,如下所示:

db.collection.aggregate([
    { "$group": {
        "_id": "$name",
        "nameCount": { "$sum": 1 },
        "Success Call": {
            "$sum": {
                "$cond": [ { "$eq": [ "$call",  "Success Call" ] }, 1, 0]
            }
        },
        "Repeat Call": {
            "$sum": {
                "$cond": [ { "$eq": [ "$call",  "Repeat Call" ] }, 1, 0]
            }
        },
        "Unsuccess Call": {
            "$sum": {
                "$cond": [ { "$eq": [ "$call",  "Unsuccess Call" ] }, 1, 0]
            }
        }
    } },
    { "$project": {
        "_id": 0, 
        "name": "$_id",
        "nameCount": 1,
        "Success Call":1,
        "Unsuccess Call":1,
        "Repeat Call":1               
    } }
])

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在JavaScript数组(NodeJs)中按(多个键)和多个属性值的总和分组

来自分类Dev

如何在SQL Server中按多列分组

来自分类Dev

如何在Dart中按多个值对列表进行分组

来自分类Dev

如何在R中按多个条件分组和求和

来自分类Dev

如何按多行和多列分组

来自分类Dev

mysql在多个列中按值分组

来自分类Dev

如何在熊猫中按索引和列分组

来自分类Dev

按多列分组,并对熊猫中其他列的值进行透视和计数

来自分类Dev

根据按日期分组的枚举值获取多列中的最大分数和名称

来自分类Dev

如何在选择多列时按 1 列分组

来自分类Dev

按多个值列分组

来自分类Dev

如何在mongodb中按嵌入值分组并为其设置名称以及总数

来自分类Dev

使用多个键按多列分组

来自分类Dev

如何在Oracle中查询列值的分布(按值范围分组)?

来自分类Dev

如何在单行和多列中传递值

来自分类Dev

如何加入按第二列中的值分组的多个单元格

来自分类Dev

熊猫按单个列中的多个值分组

来自分类Dev

如何按列值分组?

来自分类Dev

SQL按多列和多表分组

来自分类Dev

按多列分组和聚合

来自分类Dev

如何在Python Pandas中对具有计数唯一值的多列进行分组

来自分类Dev

如何在MongoDB中按季度对日期进行分组

来自分类Dev

如何在MongoDB中按倍数分组

来自分类Dev

如何在MongoDB中按数据范围对订单进行分组?

来自分类Dev

如何使用R中的多个列进行按组分组?

来自分类Dev

在MongoDB中按多个字段分组

来自分类Dev

在MongoDB中按多个字段分组

来自分类Dev

如何在mongoDb中查找和分组不同的值并获得计数?

来自分类Dev

如何在SQL查询中按最小值分组?

Related 相关文章

热门标签

归档