Суммирование и вывод итогов в Mongo View - PullRequest
0 голосов
/ 25 апреля 2018

В моем бэкэнде mongDB я вижу, что после нескольких этапов агрегации выводит информацию, которая выглядит следующим образом:

{ 
    "_id" : 25k3ejfjyi32132f9z3,
    "customer_id" : 15cgrd582950jj493g5,
    "openBalance": 24,
    // other data...
},
{ 
    "_id" : 35g6ejfjfj32132f8s4, 
    "customer_id" : 23gtrd684563jj494f4
    "openBalance": 20,
    // other data...
}

То, что мне нужно сделать, в качестве последнего шага, - это всего всего«openBalance» составляет для всех записей, и выведите это число в новое поле вместе с другими данными.Итак, другими словами, исходя из приведенных выше данных, я хочу вернуть 44 в поле с названием totalOpenBalance.

Есть ли способ обработки логики агрегации в монго-представлении?Я не уверен, как это сделать, потому что я не хочу добавлять поле к каждой возвращаемой записи, а вместо этого возвращать значение на основе общего количества записей?Это будет выглядеть примерно так:

{ 
    "_id" : 25k3ejfjyi32132f9z3,
    "customer_id" : 15cgrd582950jj493g5,
    "openBalance": 24,
    // other data...
},
{ 
    "_id" : 35g6ejfjfj32132f8s4, 
    "customer_id" : 23gtrd684563jj494f4
    "openBalance": 20,
    // other data...
},
"totalOpenBalance": 44

1 Ответ

0 голосов
/ 25 апреля 2018

Если вы добавите следующий код в конец вашего конвейера

$group: {
    _id: null, // do not really group but throw all documents into the same bucket
    documents: { $push: "$$ROOT" }, // push each encountered document into the group
    totalOpenBalance: { $sum: "$openBalance" } // sum up all "openBalance" values
}

, вы получите что-то, что вы можете использовать:

{
    "_id" : null,
    "documents" : [ 
        {
            "_id" : 25k3ejfjyi32132f9z3,
            "customer_id" : 15cgrd582950jj493g5,
            "openBalance" : 24
        }, 
        {
            "_id" : 35g6ejfjfj32132f8s4,
            "customer_id" : 23gtrd684563jj494f4,
            "openBalance" : 20
        }
    ],
    "totalOpenBalance" : 44
}

Если вы хотите пойтиполностью сумасшедший, который я не очень рекомендую, тогда читайте дальше.Добавив следующие этапы

{
    $group: {
        _id: null, // do not really group but throw all documents into the same bucket
        documents: { $push: "$$ROOT" }, // push each encountered document into the group
        totalOpenBalance: { $sum: "$openBalance" } // sum up all "openBalance" values
    }
}, {
    $project: {
        "_id": 0, // remove the "_id" field
        "documents": { $concatArrays: [ "$documents", [ { "totalOpenBalance": "$totalOpenBalance" } ] ] } // append a magic subdocument to the the existing documents
    }
}, {
    $unwind: "$documents" // just so we can flatten the resulting array into separate documents
}, {
    $replaceRoot: {
        newRoot: "$documents" // and move the content of our documents field to the root
    }
}

, вы получите именно то, что просили:

{
    "_id" : 25k3ejfjyi32132f9z3,
    "customer_id" : 15cgrd582950jj493g5,
    "openBalance" : 24
},
{
    "_id" : 35g6ejfjfj32132f8s4,
    "customer_id" : 23gtrd684563jj494f4,
    "openBalance" : 20
},
{
    "totalOpenBalance" : 44
}

Однако это, вероятно, просто перебор ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...