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?

Jawaban:


327

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

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

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}}
])

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

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

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" }
]);

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"}}}])
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.