首页 > 解决方案 > 如何在 mongodb 上计算/求和数组?

问题描述

我有一个集合,其中每个文档都有一个名为“联系人”的数组。

示例文档:

{
    "_id" : ObjectId("5660c2dfdfdfcba2d47baa2d9"),
    "name" : john,
    "contacts" : [ 
        {
            "name" : "ari",
            "phone" : "12341234"
        }, 
         {
            "name" : "dea",
            "phone" : "34234234"
        }
    ]
},

{
    "_id" : ObjectId("5660c2dfdfdfcba2d47baa2d9"),
    "name" : joni,
    "contacts" : [ 
        {
            "name" : "budi",
            "phone" : "13341234"
        }, 
         {
            "name" : "ade",
            "phone" : "3242343"
        },
{
            "name" : "are",
            "phone" : "64545345"
        }

    ]
}

我想知道获取所有文档的联系人总数。从示例文档输出应该是 5 个联系人

感谢你们对我的帮助。

标签: mongodbmongodb-querynosqlaggregation-framework

解决方案


您可以尝试以下查询:

1)如果每个文档中都存在联系人数组:

db.collection.aggregate([
    /** project only needed field contacts with size of array in each doc */
    {
        $project: {
            _id: 0,
            contacts: {
                $size: "$contacts"
            }
        }
    },
    /** group on empty(without any filter) & sum contacts field */
    {
        $group: {
            _id: "",
            TotalContacts: {
                $sum: "$contacts"
            }
        }
    },
    /** Optional projection */
    {
        $project: {
            _id: 0
        }
    }
])

2)如果联系人数组字段可能不存在于每个文档中,如果它存在且不是数组,则必须在下面进行额外的类型检查$cond

db.collection.aggregate([
    /** group on empty(without any filter) & sum contacts field's size if contacts exists else sum 0, You've can have optional projection as first stage like above query */
    {
        $group: {
            _id: "",
            TotalContacts: {
                $sum: {
                    $cond: [
                        {
                            "$ifNull": [
                                "$contacts",
                                false
                            ]
                        },
                        {
                            $size: "$contacts"
                        },
                        0
                    ]
                }
            }
        }
    },
    /** Optional projection */
    {
        $project: {
            _id: 0
        }
    }
])

测试: MongoDB-游乐场


推荐阅读