MongoDB เลือกกลุ่มนับโดย


180

ฉันกำลังเล่นกับ MongoDB พยายามคิดวิธีทำง่ายๆ

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

แต่ดูเหมือนว่าฉันจะไม่สามารถเข้าใจได้โดยใช้ฟังก์ชันการรวม ฉันสามารถทำได้โดยใช้ไวยากรณ์กลุ่มที่แปลกจริง ๆ

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

แต่จะมีวิธีที่ง่ายกว่า / เร็วกว่าในการใช้ฟังก์ชั่นรวมหรือไม่

คำตอบ:


326

นี่จะเป็นวิธีที่ง่ายกว่าในการใช้aggregate:

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

1
ฉันได้รับข้อความแสดงข้อผิดพลาดเมื่อฉันพยายามที่"errmsg" : "exception: A pipeline stage specification object must contain exactly one field.",?
Steven

คุณจัดกลุ่มอย่างไร ฉันต้องการเรียงลำดับตาม -1
Filip Bartuzi

4
@FilipBartuzi มีตัวอย่างในหน้าเอกสารคุณจะต้องเพิ่มการดำเนินการเรียงลำดับไปป์ไลน์เช่น{ $sort: { count: -1 } }
elaich

ฉันได้รับข้อยกเว้นเช่นเดียวกับ @Steven และเป็นเพราะฉันคัดลอกวางเพียงบรรทัด 2 และละเว้นวงเล็บเหลี่ยมโดยรอบ
Peter Perháč

กรุณาช่วยถ้าคุณสามารถสำหรับคำถามที่เกี่ยวข้องใน mongoDB - stackoverflow.com/questions/61067856/ …
newdeveloper

66

ฉันต้องการการดำเนินการพิเศษบางอย่างจากผลลัพธ์ของฟังก์ชันการรวม ในที่สุดฉันก็ได้พบโซลูชันสำหรับฟังก์ชันการรวมและการดำเนินการตามผลลัพธ์ใน MongoDB ฉันได้คอลเลกชันที่มีเขตRequestrequest, source, status, requestDate

กลุ่มฟิลด์เดี่ยวโดย & นับ:

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

จัดกลุ่มหลายฟิลด์ตาม & จำนวน:

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

หลายฟิลด์จัดกลุ่มตาม & นับพร้อมเรียงโดยใช้ฟิลด์:

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

หลายฟิลด์จัดกลุ่มตาม & นับพร้อมเรียงโดยใช้จำนวน:

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

50

หากคุณต้องการหลายคอลัมน์เพื่อจัดกลุ่มตามให้ทำตามรุ่นนี้ ที่นี่ฉันกำลังนับโดยstatusและtype:

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

2
_id แทนค่าพารามิเตอร์เริ่มต้นสำหรับการห่อหลายฟิลด์?
Eugen Sunic

18

นอกจากนี้หากคุณต้องการ จำกัด การจัดกลุ่มคุณสามารถใช้:

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

17

เริ่มต้นใน MongoDB 3.4 คุณสามารถใช้การ$sortByCountรวม

จัดกลุ่มเอกสารขาเข้าตามค่าของนิพจน์ที่ระบุจากนั้นคำนวณจำนวนเอกสารในแต่ละกลุ่มที่แตกต่างกัน

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

ตัวอย่างเช่น:

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

2
น่าจะเป็นที่น่าสังเกตว่านี่$sortByCountคือ "ตัวดำเนินการปลอม" เหมือนกับตัวดำเนินการขั้นตอนการรวมเพิ่มเติมที่แนะนำจาก MongoDB 3.4 สิ่งที่พวกเขาทำจริงๆคือขยายไปสู่ขั้นตอนการรวมกลุ่มของตน ในกรณีนี้$groupด้วย$sum: 1ตามที่ปรากฏในคำตอบที่มีอยู่และเพิ่ม$sort ขั้นตอน พวกเขาไม่ได้เปรียบอะไรนอกจาก"การพิมพ์โค้ดที่น้อยลง"ซึ่งอาจจะใช่หรือไม่ใช่คำอธิบายเพิ่มเติมก็ได้ (ถ้าคุณชอบแบบนั้น) IMHO ความแตกต่าง$groupและ$sortขั้นตอนในรหัสนั้นมีความหมายมากกว่าและมีความยืดหยุ่นมากกว่า
Neil Lunn


0

คำสั่งเชลล์ Mongo ที่ใช้งานได้สำหรับฉัน:

db.getCollection(<collection_name>).aggregate([{"$match": {'<key>': '<value to match>'}}, {"$group": {'_id': {'<group_by_attribute>': "$group_by_attribute"}}}])
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.