/ / Verschiedene Anzahl von Feldern unter Verwendung der Mongodb-Aggregation - Mongodb, Mongodb-Abfrage, Aggregations-Framework, eindeutig

Distinct count von mehreren Feldern mit mongodb aggregation - mongodb, mongodb-query, aggregation-framework, distinct

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 № 1

Sie 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 $projectoder $addFieldsSie 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" }
}
}
])