MongoDB SELECT COUNT GROUP OLEH

181

Saya bermain-main dengan MongoDB mencoba mencari cara untuk melakukan yang sederhana

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

Tapi sepertinya saya tidak bisa memahaminya menggunakan fungsi agregat. Saya dapat melakukannya dengan menggunakan beberapa sintaks grup yang sangat aneh

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++;
    }
});

Tetapi apakah ada cara yang lebih mudah / lebih cepat menggunakan fungsi agregat?

Steven
sumber

Jawaban:

327

Ini akan menjadi cara yang lebih mudah untuk melakukannya menggunakan aggregate:

db.contest.aggregate([
    {"$group" : {_id:"$province", count:{$sum:1}}}
])
Anand Jayabalan
sumber
1
Saya mendapatkan pesan kesalahan saat saya mencobanya "errmsg" : "exception: A pipeline stage specification object must contain exactly one field.",?
Steven
bagaimana Anda mengelompokkannya? Saya ingin menyortir hitungan dengan -1
Filip Bartuzi
4
@FilipBartuzi ada contoh di halaman dokumentasi, Anda harus menambahkan semacam operasi ke pipa, sebagai{ $sort: { count: -1 } }
elaich
Saya mendapat pengecualian yang sama dengan @Steven dan itu karena saya menyalin-lekatkan hanya baris 2 dan menghilangkan tanda kurung kotak di sekitarnya.
Peter Perháč
tolong bantu jika Anda dapat untuk pertanyaan terkait di mongoDB - stackoverflow.com/questions/61067856/…
newdeveloper
66

Saya perlu beberapa operasi tambahan berdasarkan hasil fungsi agregat. Akhirnya saya menemukan beberapa solusi untuk fungsi agregat dan operasi berdasarkan hasil di MongoDB. Saya punya koleksi Requestdengan bidang request, source, status, requestDate.

Grup Bidang Tunggal Menurut & Hitung:

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

Beberapa Fields Group Menurut & Hitung:

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

Banyak Kolom Dikelompokkan Menurut & Hitung dengan Sortir menggunakan Bidang:

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

Beberapa Fields Kelompok Menurut & Hitung dengan Sortir menggunakan Hitung:

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

Jika Anda memerlukan beberapa kolom untuk dikelompokkan, ikuti model ini. Di sini saya melakukan penghitungan dengan statusdan type:

  db.BusinessProcess.aggregate({
    "$group": {
        _id: {
            status: "$status",
            type: "$type"
        },
        count: {
            $sum: 1
        }
    }
   })
KitkatJohn
sumber
2
_id mewakili param default untuk merangkum beberapa bidang?
Eugen Sunic
18

Selain itu jika Anda perlu membatasi pengelompokan yang dapat Anda gunakan:

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

Mulai di MongoDB 3.4, Anda bisa menggunakan $sortByCountagregasi.

Mengelompokkan dokumen yang masuk berdasarkan nilai ekspresi yang ditentukan, lalu menghitung jumlah dokumen di setiap grup yang berbeda.

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

Sebagai contoh:

db.contest.aggregate([
    { $sortByCount: "$province" }
]);
MattM
sumber
2
Mungkin patut dicatat di sini yang $sortByCountsebenarnya adalah "operator semu" seperti beberapa operator tahap agregasi yang diperkenalkan dari MongoDB 3.4. Yang mereka lakukan hanyalah memperluas ke tahap agregasi masing-masing. Dalam hal ini a $groupdengan $sum: 1seperti yang ditunjukkan pada jawaban yang ada dan $sort tahap tambahan . Mereka tidak menawarkan keuntungan selain "mengetik lebih sedikit kode" , yang mungkin atau mungkin tidak lebih deskriptif (jika Anda suka hal-hal semacam itu). IMHO, berbeda $groupdan $sorttahapan dalam kode jauh lebih deskriptif dan memang lebih fleksibel.
Neil Lunn
0

Perintah Mongo shell yang bekerja untuk saya:

db.getCollection(<collection_name>).aggregate([{"$match": {'<key>': '<value to match>'}}, {"$group": {'_id': {'<group_by_attribute>': "$group_by_attribute"}}}])
Riha
sumber