È possibile unire campi array durante l'utilizzo del framework di aggregazione MongoDB? Qui è un problema di sintesi che sto cercando di risolvere:Unione di campi array nell'aggregazione MongoDB
documenti di input di esempio per l'aggregazione:
{
"Category" : 1,
"Messages" : ["Msg1", "Msg2"],
"Value" : 1
},
{
"Category" : 1,
"Messages" : [],
"Value" : 10
},
{
"Category" : 1,
"Messages" : ["Msg1", "Msg3"],
"Value" : 100
},
{
"Category" : 2,
"Messages" : ["Msg4"],
"Value" : 1000
},
{
"Category" : 2,
"Messages" : ["Msg5"],
"Value" : 10000
},
{
"Category" : 3,
"Messages" : [],
"Value" : 100000
}
Vogliamo gruppo da 'categoria', mentre riassumendo 'Valore' e la fusione 'Messaggi'. Ho provato questo aggregazione oleodotto:
{group : {
_id : "$Category",
Value : { $sum : "$Value"},
Messages : {$push : "$Messages"}
}
},
{$unwind : "$Messages"},
{$unwind : "$Messages"},
{$group : {
_id : "$_id",
Value : {$first : "$Value"},
Messages : {$addToSet : "$Messages"}
}
}
Il risultato è:
"result" : [{
"_id" : 1,
"Value" : 111,
"Messages" : ["Msg3", "Msg2", "Msg1"]
},
{
"_id" : 2,
"Value" : 11000,
"Messages" : ["Msg5", "Msg4"]
}
]
Tuttavia, questo manca completamente di categoria 3 dal momento che i documenti in cui 'Categoria' è di 3 non hanno alcun 'Messaggi' e sono lasciati cadere dal secondo svolgersi. Vorremmo che il risultato includesse anche quanto segue:
{
"_id" : 3,
"Value" : 100000,
"Messages" : []
}
Esiste un modo efficace per raggiungere questo obiettivo dal quadro di aggregazione?
è messaggi garantito di essere lì come un array? O è possibile che non esisterà o ci sarà ma come un tipo diverso? –
sì È garantito che i messaggi esistano come array (che può essere vuoto per alcuni record). – etkarayel
hai provato l'opzione 'preserveNullAndEmptyArrays' a' $ unwind'? –