Eigentlich gibt es zwei verschiedene Möglichkeit, dies zu tun, abhängig von Ihrer MongoDB-Serverversion.
Der optimale Weg ist in MongoDB 3.2 mit den eckigen Klammern []
direkt neue Array-Felder in der $project
Bühne zu erstellen. Dies gibt ein Array für jede Gruppe zurück. Die nächste Stufe ist die andere Stufe $group
, in der Sie Ihr Dokument gruppieren und den Akkumulatoroperator $push
verwenden, um ein zweidimensionales Array zurückzugeben.
db.getCollection('user_actions').aggregate([
{ "$match": {
"type": 'play_started',
"entity_id": { "$ne": null }
}},
{ "$group": {
"_id": "$entity_id",
"view_count": { "$sum": 1}
}},
{ "$project": {
"_id": 0,
"result": [ "$_id", "$view_count" ]
}},
{ "$group": {
"_id": null,
"result": { "$push": "$result" }
}}
])
Von MongoDB 2.6 und vor 3.2 müssen Sie einen anderen Ansatz. Um Ihr Array zu erstellen, müssen Sie den Operator $map
verwenden. Da das $map
"Eingabe" -Feld in und Array aufgelöst werden muss, müssen Sie den Operator $literal
verwenden, um einen literalen Array-Wert auf input
zu setzen. Natürlich gibt der Operator $cond
hier die "entity_id" oder "view_count" entsprechend dem "boolean-expression" zurück.
db.getCollection('user_actions').aggregate([
{ "$match": {
"type": 'play_started',
"entity_id": { "$ne": null }
}},
{ "$group": {
"_id": "$entity_id",
"view_count": { "$sum": 1}
}},
{ "$project": {
"_id": 0,
"result": {
"$map": {
"input": { "$literal": [ "A", "B"] },
"as": "el",
"in": {
"$cond": [
{ "$eq": [ "$$el", "A" ] },
"$_id",
"$view_count"
]
}
}
}
}},
{ "$group": {
"_id": null,
"result": { "$push": "$result" }
}}
])
Es ist erwähnenswert, dass dies auch in MongoDB 2.4 funktioniert. Wenn Sie MongoDB 2.2 ausführen, können Sie den undokumentierten Operator $const
verwenden, der dasselbe tut.
Bitte einige Beispieldokumente posten. – Saleem