MongoDB SEÇİM SAYACI GRUBU


180

MongoDB ile basit bir oyunun nasıl yapıldığını anlamaya çalışıyorum

SELECT province, COUNT(*) FROM contest GROUP BY province

Ama toplama işlevini kullanarak anlayamıyorum. Gerçekten garip bir grup sözdizimi kullanarak yapabilirim

db.user.group({
    "key": {
        "province": true
    },
    "initial": {
        "count": 0
    },
    "reduce": function(obj, prev) {
        if (true != null) if (true instanceof Array) prev.count += true.length;
        else prev.count++;
    }
});

Ancak toplama işlevini kullanmanın daha kolay / hızlı bir yolu var mı?

Yanıtlar:


326

Bunu kullanarak bunu yapmanın daha kolay yolu olurdu aggregate:

db.contest.aggregate([
    {"$group" : {_id:"$province", count:{$sum:1}}}
])

1
Bunu denediğimde bir hata mesajı alıyorum "errmsg" : "exception: A pipeline stage specification object must contain exactly one field.",?
Steven

nasıl sıralarsınız?
Sayıyı

4
@FilipBartuzi dokümantasyon sayfasında bir örnek var, boru hattına bir sıralama işlemi eklemeniz gerekecek,{ $sort: { count: -1 } }
elaich

@Steven ile aynı istisnayı aldım ve sadece 2. satırı kopyalayıp yapıştırdım ve çevresindeki köşeli parantezleri atladım.
Peter Perháč

pls yardım eğer mongoDB ilgili sorular için - stackoverflow.com/questions/61067856/…
newdeveloper

66

Toplama işlevinin sonucuna göre bazı ekstra işlemlere ihtiyacım var. Sonunda toplama işlevi ve MongoDB sonuç dayalı işlem için bazı çözüm buldum. Tarlalı bir koleksiyonum Requestvar request, source, status, requestDate.

Tek Alanlı Gruplama ve Sayma:

db.Request.aggregate([
    {"$group" : {_id:"$source", count:{$sum:1}}}
])

Birden Çok Alan Gruplandır ve Say:

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}}
])

Birden Çok Alan, Alanı kullanarak Sırala ve Sırala:

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}},
    {$sort:{"_id.source":1}}
])

Sayı Kullanarak Sırala ile Birden Çok Alan Gruplama ve Sayma:

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}},
    {$sort:{"count":-1}}
])

50

Gruplamak için birden fazla sütuna ihtiyacınız varsa bu modeli izleyin. Burada statusve tarafından bir sayım yürütüyorum type:

  db.BusinessProcess.aggregate({
    "$group": {
        _id: {
            status: "$status",
            type: "$type"
        },
        count: {
            $sum: 1
        }
    }
   })

2
_id, birden çok alanı kapsüllemek için varsayılan bir parametreyi temsil ediyor mu?
Eugen Sunic

18

Ayrıca, gruplandırmayı kısıtlamanız gerekiyorsa şunları kullanabilirsiniz:

db.events.aggregate( 
    {$match: {province: "ON"}},
    {$group: {_id: "$date", number: {$sum: 1}}}  
)

17

MongoDB 3.4'ten başlayarak, $sortByCounttoplamayı kullanabilirsiniz .

Gelen belgeleri belirli bir ifadenin değerine göre gruplandırır, ardından her ayrı gruptaki belge sayısını hesaplar.

https://docs.mongodb.com/manual/reference/operator/aggregation/sortByCount/

Örneğin:

db.contest.aggregate([
    { $sortByCount: "$province" }
]);

2
Muhtemelen burada $sortByCountMongoDB 3.4'ten tanıtılan daha fazla toplama aşaması operatörü gibi bir "sözde operatör" olduğunu belirtmek gerekir . Gerçekten yaptıkları tek şey, kendi toplama aşamalarına genişletmektir . Bu durumda a ise $groupile $sum: 1mevcut cevapları ve ek gösterildiği gibi $sort aşamasında. Daha az açıklayıcı olabilecek veya olmayabilecek (daha az kod yazmaktan) başka bir avantaj sunmazlar (eğer bu tür bir şeyin içindeyseniz). IMHO, koddaki farklı $groupve $sortaşamalar çok daha açıklayıcı ve gerçekten daha esnektir.
Neil Lunn


0

Benim için çalışan Mongo kabuğu komutu:

db.getCollection(<collection_name>).aggregate([{"$match": {'<key>': '<value to match>'}}, {"$group": {'_id': {'<group_by_attribute>': "$group_by_attribute"}}}])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.