Mongo telt exemplaren van elke waarde voor een set documenten

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 .resultvanaf 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 $arrayToObjectoperator en een $replaceRootpijplijn 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 } }
  ])

Other episodes