как посчитать / суммировать массив на mongodb? - PullRequest
1 голос
/ 07 марта 2020

У меня есть коллекция, в которой у каждого документа есть массив с именем "contacts".

Образцы документов:

{
    "_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 контактов

Спасибо за помощь.

1 Ответ

1 голос
/ 07 марта 2020

Вы можете попробовать выполнить запрос ниже:

1) Если контакты массив существует в каждом do c:

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) Если контакты Поле массива может не существовать в каждом do c, если оно существует и не является массивом, тогда необходимо выполнить дополнительную проверку типа ниже $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
        }
    }
])

Test : MongoDB-Playground

...