文档数组中的MongoDB组和计数对象

时间:2021-08-01 01:03:36

标签: database mongodb

我需要对对象中的数组进行分组和计数。 我尝试了很多东西,但都无法解决。

我有一个这样的 mongodb 文档:

[
    {
        "id" : 1,
        "name" : "A",
        "connected" : [
            {
                "iid" : 1,
                "risk" : "high"
            },
            {
                "iid" : 2,
                "risk" : "high"
            },
            {
                "iid" : 3,
                "risk" : "low"
            }
        ]
    }, 
    {
        "id" : 2,
        "name" : "B",
        "connected" : [
            {
                "iid" : 4,
                "risk" : "medium"
            },
            {
                "iid" : 5,
                "risk" : "medium"
            },
            {
                "iid" : 6,
                "risk" : "low"
            }
        ]
    },
    {
        "id":3,
        "name":"C"
    }
]

我想要一个给我这样结​​果的查询:

[
    {
        "id":1,
        "name":"A",
        "count": {
            "high" : 2,
            "low" : 1
        }
    },
    {
        "id":2,
        "name":"B",
        "count": {
            "medium" : 2,
            "low" : 1
        }
    },
    {
        "id":3,
        "name":"C"
    }
]

我在“$addFields”聚合查询中尝试了“$group”,但除了“$group”之外它没有。

2 个答案:

答案 0 :(得分:1)

您可以在聚合管道中执行以下操作:

  1. $unwind connected 数组
  2. $group 通过 idconnected.risk 获取计数
  3. $group by id 将结果放入 {k: , v: }
  4. 使用 $arrayToObject 取回您想要的表单

这是 Mongo playground 供您参考。

答案 1 :(得分:0)

感谢@ray,我找到了解决方案并添加了一些自定义选项,例如;

  • 在结果中获取 connected 对象
  • total 字段中添加 count 计数。

如果有人需要帮助解决这些问题,可以查看此参考:

https://mongoplayground.net/p/gRIOVj4A8Bh

结果是这样的:

[
    {
        "id": 1,
        "name": "A",
        "connected": [
            {
                "iid": 1,
                "risk": "high"
            },
            {
                "iid": 2,
                "risk": "high"
            },
            {
                "iid": 3,
                "risk": "low"
            }
        ],
        "count": {
            "high": 2,
            "low": 1,
            "total": 3
        }
    },
    {
        "id": 2,
        "name": "B",
        "connected": [
            {
                "iid": 4,
                "risk": "medium"
            },
            {
                "iid": 5,
                "risk": "medium"
            },
            {
                "iid": 6,
                "risk": "low"
            }
        ],
        "count": {
            "low": 1,
            "medium": 2,
            "total": 3
        }
    },
    {
        "id": 3,
        "name": "C",
        "count": {
            "total": 0
        }
    }
]

如果不需要 connected 对象,可以在查询结束时将其添加到 $unset 列表中。