Ich versuche, verschiedene Werte mehrerer Felder durch eine Abfrage der MongoDB-Aggregation zu zählen.
Also hier meine Daten:
{
"car_type": "suv",
"color": "red",
"num_doors": 4
},
{
"car_type": "hatchback",
"color": "blue",
"num_doors": 4
},
{
"car_type": "wagon",
"color": "red",
"num_doors": 4
}
Ich möchte für jedes Feld eine eindeutige Zählung:
distinct_count_car_type=3
distinct_count_color=2
distinct_count_num_doors=1
Ich war in der Lage, mehrere Felder zu gruppieren und dann eine eindeutige Zählung durchzuführen, aber es konnte mir nur eine Zählung für das erste Feld geben. Nicht alle von ihnen. Und es ist auch eine große Menge von Daten.
Antworten:
1 für die Antwort № 1Sie suchen nach der Kraft von ... $objectToArray
!
db.foo.aggregate([
{$project: {x: {$objectToArray: "$$CURRENT"}}}
,{$unwind: "$x"}
,{$match: {"x.k": {$ne: "_id"}}}
,{$group: {_id: "$x.k", y: {$addToSet: "$x.v"}}}
,{$addFields: {size: {"$size":"$y"}} }
]);
Dies wird ergeben:
{ "_id" : "num_doors", "y" : [ 4 ], "size" : 1 }
{ "_id" : "color", "y" : [ "blue", "red" ], "size" : 2 }
{
"_id" : "car_type",
"y" : [
"wagon",
"hatchback",
"suv"
],
"size" : 3
}
Sie können $project
oder $addFields
Sie können die Menge der eindeutigen Werte oder die Größe entsprechend ein- oder ausschließen.
5 für die Antwort № 2
Das Ausführen der folgenden Aggregat-Pipeline sollte Ihnen das gewünschte Ergebnis liefern:
db.collection.aggregate([
{
"$group": {
"_id": null,
"distinct_car_types": { "$addToSet": "$car_type" },
"distinct_colors": { "$addToSet": "$color" },
"distinct_num_doors": { "$addToSet": "$num_doors" }
}
},
{
"$project": {
"distinct_count_car_type": { "$size": "$distinct_car_types" },
"distinct_count_color": { "$size": "$distinct_colors" },
"distinct_count_num_doors": { "$size": "$distinct_num_doors" }
}
}
])