/ / Verwenden Sie das mongodb-Aggregations-Framework, um nach Länge des Arrays zu gruppieren - mongodb, mapreduce, aggregation-framework

Verwenden Sie das mongodb-Aggregationsframework, um nach der Länge des Arrays zu gruppieren - mongodb, mapreduce, aggregation-framework

Ich habe eine Sammlung, die ungefähr so ​​aussieht:

{
"_id": "id0",
"name": "...",
"saved_things": [
{ ... },
{ ... },
{ ... },
]
}
{
"_id": "id1",
"name": "...",
"saved_things": [
{ ... },
]
}
{
"_id": "id2",
"name": "...",
"saved_things": [
{ ... },
]
}

etc...

Ich möchte das Aggregations-Framework von mongodb verwenden, um ein Histogramm-Ergebnis zu erhalten, das angibt, wie viele Benutzer eine bestimmte Anzahl von Benutzern haben saved_things. Beispielsweise könnte für das darüber liegende Dataset Folgendes ausgegeben werden:

{ "_id": 1, "count": 2 },
{ "_id": 3, "count": 1 }

Ich habe verschiedene Kombinationen von Aggregatfunktionen wie die unten stehende ausprobiert, aber es hat keine richtig funktioniert.

collection.aggregate([
{ $unwind: "$saved_things" },
{ $group: "$_id", count: { $sum: 1 } } },
{ $group: "$count", number: { $sum: 1 } } },
{ $sort: { number: -1 } }
], function(err, result) {
console.log(result);
});

Ist dies mit dem Aggregat-Framework von Mongo möglich, oder wäre ich mit einer Map-Reduction-Funktion besser aufgestellt?

Antworten:

5 für die Antwort № 1

OK habe es! Auf geht's. Die Aggregationspipeline sieht im Wesentlichen Folgendes aus:

{
$unwind: "$saved_things"
},
{
$group: {
_id: "$_id",
size: {
$sum: 1
}
}
},
{
$group: {
_id: "$size",
frequency: {
$sum: 1
}
}
},
{
$project: {
size: "$_id",
frequency: 1,
_id: 0
}
}

Abwickeln saved_things Array, dann nach Dokument gruppieren _id und zählen, so können wir die Arraygröße erreichen. Jetzt ist es einfach, gruppenweise size und zähle die Frequenz. Verwenden Sie das Projekt zum Umbenennen _id Feld zu size.