Mongo Aggregation $ raggruppa per _id e data
Ho una query di aggregazione mongo che attualmente raggruppa i risultati in base a un ID località e utilizza $push to return a count value using $dimensione degli elementi in un array per i documenti risultanti che corrispondono a una determinata data. Ho bisogno di regolare l'output per ogni risultato raggruppato per ID posizione e $ somma i valori di conteggio raggruppati per data. Esempi di seguito.
L'output del risultato corrente è simile a:
[{
"_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"
} ]
}]
Sto tentando di produrre il seguente output:
[{
"_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"
} ]
}]
La mia domanda attuale:
[
{ $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'
}
}
}
}
]
Soluzione: l'aggiunta della seguente query fornita da @ Rfroes87 alla fine della pipeline ha risolto il problema.
{ $unwind: "$appts" }, { $group: {
_id: { "id": "$_id", "date": "$appts.date" },
"count": { $sum: "$appts.count" }
}
},
{
$group: { _id: "$_id.id",
"appts": { $push: { "count": "$count", "date": "$_id.date" } }
}
}
Risposte
Probabilmente puoi provare, non sicuro della struttura del tuo documento,
Struttura del documento prevista:
[{"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"
}
}
}
}
])
Terreno di gioco
Puoi provare a seguire
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"
}
}
}
}
])
Parco giochi Mongo funzionante