Я довольно новичок в MongoDB и Mon goose, и я работаю над ошибкой здесь. Очевидно, $sum
не работает с полем, тип которого SchemaTypes.Double
. Этот двойной тип доступен благодаря пакету под названием mongoose-double
.
. Я не знаю, поддерживает ли MongoDB Double, поэтому у нас есть этот пакет, или это из-за версии MongoDB (он включен 3.6 AFAIK). Но в любом случае вот код:
Schedule.aggregate([{
$match: findTerm
},
{
$facet: {
totalizer: [{
$group: {
_id: '$store',
totalServices: {
$sum: 1
},
totalValue: {
$sum: '$value'
},
totalComission: {
$sum: '$comissionValue'
}
}
}
],
data: [{
$project: {
'employee.name': 1,
'customer.name': 1,
'service.name': 1,
'info.channel': 1,
value: 1,
scheduleDate: 1,
scheduleStart: 1,
scheduleEnd: 1,
comissionValue: 1,
status: 1,
paymentMethod: 1
}
},
{
$sort: sort
},
{
$skip: req.body.limit * req.body.page
},
{
$limit: req.body.limit
}
]
}
}
]).exec((e, response) => {
if (e) {
// handle error
}
res.status(200).send(response[0]);
});
Этот findTerm
отправляется приложением внешнего интерфейса и имеет следующий формат:
{ store: '5b16cceb56a44e2f6cd0324b',
status: { '$in': [ 0, 1, 2, 3 ] },
paymentMethod: { '$in': [ 0, 1, 2, 3, 4, 5 ] },
'info.channel': { '$in': [ 'app', 'admin' ] },
scheduleStart: { '$gte': '2019-11-01 00:00' },
scheduleEnd: { '$lte': '2020-03-31 23:59' }
}
Мое поле comissionValue
находится в root из моей схемы расписаний:
comissionValue: {
type: SchemaTypes.Double,
default: 0
},
Но мой результат следующий, как показано в моем console.log во внешнем интерфейсе
Как вы можете вижу, что мой totalComission
внутри моего totalizer
равен null
, но мой первый объект внутри data
имеет comissionValue
из 0.6
. Как я могу знать, что здесь не так? Я пробовал разные комбинации $facet
, фильтруя только расписания, которые имеют comissionValue
, не равное 0 и ноль, но я получил только результат 0 для totalComission
.
EDIT
Вот некоторые примеры данных:
Объект расписания:
customer: {
id: "5e41a7ba11340930742aa689",
name: "renan lima",
phone: "+5511999999999",
email: "sampleemail@gmail.com",
doc: "00000000000",
avatar: null
},
employee: {
id: "5b16cebd29bcf613f02b6fb4",
name: "Anderson Zanardi",
avatar: "anderson.jpg"
},
service: {
noValue: false,
filters: [],
id: "5b637acd634e14086c9a3aea",
name: "Barba Masculina"
},
info: {
channel: "app",
id: "5e41a7ba11340930742aa689",
name: "renan lima"
},
comissionType: null,
comissionValue: 0,
paymentMethod: 0,
_id: "5e41a7c011340930742aa68a",
store: "5b16cceb56a44e2f6cd0324b",
scheduleDate: "2020-03-16T15:00:00.000Z",
scheduleStart: "2020-03-16 09:00",
scheduleEnd: "2020-03-16 09:30",
status: 2,
value: 30,
color: "blue",
logStatus: [],
__v: 0,
created: "2020-02-10T18:58:08.845Z",
updated: "2020-02-10T18:58:08.845Z"
Мой ответ получен за Schedule.aggregate
:
{
"totalizer": [{
"_id": null,
"storesCount": [{
"store": "5b16cceb56a44e2f6cd0324b",
"count": 12
}],
"totalValue": 410.5,
"totalServices": 12,
"totalComission": 75
}],
"data": [{
"_id": "5e5d04dcb4a2f42204598ebf",
"service": {
"name": "Outros"
},
"info": {
"channel": "admin"
},
"comissionValue": 0,
"paymentMethod": 0,
"customer": {
"name": "teste"
},
"employee": {
"name": "Gabriel Barreto"
},
"scheduleDate": "2020-03-02T13:06:00.000Z",
"scheduleStart": "2020-03-02 10:06",
"scheduleEnd": "2020-03-02 10:36",
"status": 0,
"value": null
}]
}
Здесь комиссия 75, я не знаю, из-за scheduleStart
и scheduleDate
в findTerm
на моем $match
, что это время начинается в 2020-03-01 и заканчивается в 2020-03-31 и в этом диапазоне Есть 3 графика с 25 комиссионных. Может быть, моя нумерация страниц возвращает его в ноль? Поскольку мне нужно, чтобы он суммировал все мои комиссионные за заданный диапазон начала / конца, даже если на определенной странице нет комиссионных.
РЕДАКТИРОВАТЬ 2
Я добавил пример данных в Mon go Playground массив расписаний в столбце конфигурации соответствует запросу, используемому в свойстве $ match столбца запроса. Вот ссылка: https://mongoplayground.net/p/nmyAsY4g7LS