MongoDB array [] sum-function - PullRequest
1 голос
/ 02 мая 2020

Я пытаюсь подсчитать сумму всех остатков для каждой валюты в базе данных. Мне пришлось сгруппировать его по валюте, но $sum возвращало исключение. Есть идеи, как это исправить?

исключение: запрос не выполнен: (Location40237) Аккумулятор $ sum является унарным оператором

    db.getCollection("people").aggregate([
    {
        $group: {
            _id: { currency:  "$credit.currency" },
            sumCur: { $sum: [ { $toDouble:  "$credit.balance" }]}

        }
    }
])

Пример модели данных:

{ 
    "_id" : ObjectId("5ea970747cd4ac05869977ec"), 
    "sex" : "Male", 
    "first_name" : "Wayne", 
    "last_name" : "Fields", 
    "job" : "Speech Pathologist", 
    "email" : "wfields0@diigo.com", 
    "location" : {
        "city" : "Oyo", 
        "address" : {
            "streetname" : "Beilfuss", 
            "streetnumber" : "860"
        }
    }, 
    "description" : "vulputate justo in blandit ultrices enim lorem ipsum dolor sit amet consectetuer adipiscing elit proin interdum mauris", 
    "height" : "152.38", 
    "weight" : "66.81", 
    "birth_date" : "1990-02-21T02:55:03Z", 
    "nationality" : "Nigeria", 
    "credit" : [
        {
            "type" : "switch", 
            "number" : "6759888939100098699", 
            "currency" : "COP", 
            "balance" : "5117.06"
        }
    ]
}

1 Ответ

2 голосов
/ 02 мая 2020

$sum ожидает скалярное значение цифры c при передаче массива. Сначала необходимо использовать $ unwind , поскольку разные элементы массива также могут иметь разные валюты:

db.collection.aggregate([
    { $unwind: "$credit" },
    {
        $group: {
            _id: {
                currency: "$credit.currency"
            },
            sumCur: {
                $sum: { $toDouble: "$credit.balance" }
            }
        }
    }
])

Пн go Детская площадка

...