Mongo Aggregation $ group par _id et date
J'ai une requête d'agrégation mongo qui regroupe actuellement les résultats en fonction d'un identifiant d'emplacement et utilise $push to return a count value using $taille des éléments d'un tableau pour les documents résultants correspondant à une date donnée. Je dois ajuster la sortie pour chaque résultat groupé par identifiant d'emplacement et $ sum les valeurs de comptage groupées par date. Exemples ci-dessous.
La sortie de résultat actuelle ressemble à:
[{
"_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"
} ]
}]
J'essaye de produire la sortie suivante:
[{
"_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"
} ]
}]
Ma requête actuelle:
[
{ $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'
}
}
}
}
]
Solution: l'ajout de la requête suivante fournie par @ Rfroes87 à la fin du pipeline a résolu le problème.
{ $unwind: "$appts" }, { $group: {
_id: { "id": "$_id", "date": "$appts.date" },
"count": { $sum: "$appts.count" }
}
},
{
$group: { _id: "$_id.id",
"appts": { $push: { "count": "$count", "date": "$_id.date" } }
}
}
Réponses
Vous pouvez probablement essayer, pas sûr de la structure de votre document,
Structure de document prévue:
[{"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"
}
}
}
}
])
Terrain de jeux
Vous pouvez essayer de suivre
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"
}
}
}
}
])
Travail aire de jeux Mongo