Ik heb enkele documenten zoals deze:
{
"user": '1'
},
{ "user": '1'
},
{
"user": '2'
},
{
"user": '3'
}
Ik zou graag een verzameling van alle verschillende gebruikers en hun respectievelijke aantallen willen hebben, gesorteerd in afnemende volgorde. Dus mijn output zou ongeveer zo zijn:
{
'1': 2,
'2': 1,
'3': 1
}
Ik denk dat dit kan worden gedaan met een Mongo-aggregaat(), maar ik heb veel moeite om de juiste stroom hiervoor te vinden.
Antwoord 1, autoriteit 100%
U kunt resultaat krijgen (niet in uw vereiste formaat) via aggregatie
db.collection.aggregate(
{$group : { _id : '$user', count : {$sum : 1}}}
).result
de uitvoer voor uw voorbeelddocumenten is:
"0" : {
"_id" : "2",
"count" : 1
},
"1" : {
"_id" : "3",
"count" : 1
},
"2" : {
"_id" : "1",
"count" : 2
}
Antwoord 2, autoriteit 44%
Voor iedereen die dit in januari 2019 leest, werkt het geaccepteerde antwoord momenteel niet in Robo3T (retourneert een pipeline.length - 1
-fout).
Je moet:
a) zet de zoekopdracht tussen vierkante haken []
b) verwijder .result
vanaf het einde
https://github.com/Studio3T/robomongo/issues/1519# issuecomment-441348191
Hier is een update van het geaccepteerde antwoord van @disposer dat voor mij werkt in Robo3T.
db.getCollection('collectionName').aggregate(
[ {$group : { _id : '$user', count : {$sum : 1}}} ]
)
Antwoord 3, autoriteit 11%
Met MongoDb 3.6 en nieuwer kunt u gebruikmaken van $arrayToObject
operator en een $replaceRoot
pijplijn om het gewenste resultaat te krijgen. U zou de volgende geaggregeerde pijplijn moeten uitvoeren:
db.collection.aggregate([
{ "$group": {
"_id": "$user",
"count": { "$sum": 1 }
} },
{ "$sort": { "_id": 1 } },
{ "$group": {
"_id": null,
"counts": {
"$push": {
"k": "$_id",
"v": "$count"
}
}
} },
{ "$replaceRoot": {
"newRoot": { "$arrayToObject": "$counts" }
} }
])
wat oplevert
{
"1" : 2,
"2" : 1,
"3" : 1
}
Antwoord 4, autoriteit 5%
U kunt de onderstaande aggregatiequery gebruiken. Deze sorteert de resultaten ook in aflopende volgorde zoals gewenst.
db.collection.aggregate([
{ $group: { _id: "$user", count: { $sum: 1 } } },
{ $sort: { count: -1 } }
])