Группа Mongo Aggregation $ по _id и дате
У меня есть запрос агрегирования mongo, который в настоящее время группирует результаты на основе идентификатора местоположения и использует $push to return a count value using $размер элементов в массиве для результирующих документов, соответствующих заданной дате. Мне нужно настроить вывод для каждого результата, сгруппированного по идентификатору местоположения, и $ суммировать значения счетчика, сгруппированные по дате. Примеры ниже.
Текущий вывод результата выглядит следующим образом:
[{
"_id" : "100",
"appts" : [
{
"count" : NumberInt(2),
"date" : "2020-08-07"
},
{
"count" : NumberInt(2),
"date" : "2020-08-07"
} ]
},
{
"_id" : "103",
"appts" : [
{
"count" : NumberInt(1),
"date" : "2020-08-07"
},
{
"count" : NumberInt(3),
"date" : "2020-08-07"
},
{
"count" : NumberInt(2),
"date" : "2020-08-08"
} ]
}]
Я пытаюсь получить следующий результат:
[{
"_id" : "100",
"appts" : [
{
"count" : NumberInt(4),
"date" : "2020-08-07"
} ]
},
{
"_id" : "103",
"appts" : [
{
"count" : NumberInt(4),
"date" : "2020-08-07"
},
{
"count" : NumberInt(2),
"date" : "2020-08-08"
} ]
}]
Мой текущий запрос:
[
{ $match: { ... } },
{
$group: { _id: { date: { $dateToString: { format: '%Y-%m-%d', date: '$time' } }, loc: '$location.branchId',
additionalReminders: '$analytics.twilio.additionalReminders' } } }, { $group: {
_id: '$_id.loc', appts: { $push: {
count: { $size: '$_id.additionalReminders' },
date: '$_id.date'
}
}
}
}
]
Решение: добавление следующего запроса от @ Rfroes87 в конец конвейера решило проблему.
{ $unwind: "$appts" }, { $group: {
_id: { "id": "$_id", "date": "$appts.date" },
"count": { $sum: "$appts.count" }
}
},
{
$group: { _id: "$_id.id",
"appts": { $push: { "count": "$count", "date": "$_id.date" } }
}
}
Ответы
Возможно, вы можете попробовать, не уверенный в структуре вашего документа,
Прогнозируемая структура документа:
[{"time":ISODate("1970-01-01T00:00:00Z"),"location":{branchId:1},analytics:{twilio:{additionalReminders:[1,2,3]}}},{"time":ISODate("1970-01-01T00:00:00Z"),"location":{branchId:1},analytics:{twilio:{additionalReminders:[1,2]}}},{"time":ISODate("1970-01-02T00:00:00Z"),"location":{branchId:1},analytics:{twilio:{additionalReminders:[1,2,3]}}},]
db.collection.aggregate([
{
$group: { _id: { date: { $dateToString: { format: "%Y-%m-%d", date: "$time" } }, loc: "$location.branchId"
},
// get size of array and sum here
additionalReminders: {
$sum: { $size: "$analytics.twilio.additionalReminders" } } } }, { $group: {
_id: "$_id.loc", appts: { $push: {
// add just field here
count: "$additionalReminders", date: "$_id.date"
}
}
}
}
])
Игровая площадка
Вы можете попробовать следующее
db.collection.aggregate([
{
$unwind: "$appts"
},
{
$group: { _id: { "_id": "$_id",
"date": "$appts.date" }, "count": { $sum: "$appts.count" } } }, { $group: {
_id: "$_id._id", "appts": { "$addToSet": {
"count": "$count", "date": "$_id.date"
}
}
}
}
])
Рабочая площадка Mongo