Мангуста суммирует значение во всех документах

Я рассчитываю подсчитать все столбцы с количеством названий в документах, которые соответствуют моему запросу,

 tickets.count({time: {$gte: a}, time: {$lte: tomorrow}}).then(function (numTickets) {

Как я могу получить общий результат столбца документа под названием сумма?

Пример, если у меня есть:

{ time: 20, amount: 40}
{ time: 40, amount: 20}

он вернул бы общую сумму (60)?

Помните, что мне нужно использовать {time: {$gte: a}, time: {$lte: tomorrow} в запросе.

Как бы я это сделал?

1 ответ

Решение

Попробуйте это с помощью механизма агрегации, используя операторы $match и $group, т.е. что-то вроде этого

db.tickets.aggregate([
    { $match: { time: {$gte: a, $lte: tomorrow} } },
    { $group: { _id: null, amount: { $sum: "$amount" } } }
])

например, с такими данными испытаний

/* 1 */
{
    "_id" : ObjectId("57e0ed40828913a99c2ceb46"),
    "time" : 20,
    "amount" : 40
}

/* 2 */
{
    "_id" : ObjectId("57e0ed40828913a99c2ceb47"),
    "time" : 40,
    "amount" : 20
}

/* 3 */
{
    "_id" : ObjectId("57e0ed40828913a99c2ceb48"),
    "time" : 50,
    "amount" : 10
}

/* 4 */
{
    "_id" : ObjectId("57e0ed40828913a99c2ceb49"),
    "time" : 10,
    "amount" : 5
}

конвейер (с фиктивным диапазоном времени), подобный следующему

db.tickets.aggregate([
    { $match: { time: {$gte: 20, $lte: 40} } },
    { $group: { _id: null, amount: { $sum: "$amount" } } }
])

даст вам такой результат

/* 1 */
{
    "_id" : null,
    "amount" : 60
}

Трубопровод в действии

Другие вопросы по тегам