MongoDB CHỌN NHÓM THEO NHÓM


179

Tôi đang chơi xung quanh với MongoDB đang cố gắng tìm ra cách làm đơn giản

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

Nhưng tôi dường như không thể tìm ra nó bằng cách sử dụng hàm tổng hợp. Tôi có thể làm điều đó bằng cách sử dụng một số cú pháp nhóm thực sự kỳ lạ

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

Nhưng có cách nào dễ dàng hơn / nhanh hơn bằng cách sử dụng hàm tổng hợp không?

Câu trả lời:


326

Đây sẽ là cách dễ dàng hơn để làm điều đó bằng cách sử dụng aggregate:

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

1
Tôi nhận được một thông báo lỗi khi tôi thử điều đó "errmsg" : "exception: A pipeline stage specification object must contain exactly one field.",?
Steven

Làm thế nào để bạn nhóm sắp xếp nó? Tôi muốn sắp xếp số đếm theo -1
Filip Bartuzi

4
@FilipBartuzi có một ví dụ trong trang tài liệu, bạn sẽ phải thêm một thao tác sắp xếp vào đường ống, như{ $sort: { count: -1 } }
elaich

Tôi có ngoại lệ tương tự như @Steven và đó là vì tôi đã sao chép chỉ dòng 2 và bỏ qua các dấu ngoặc vuông xung quanh.
Peter Perháč

vui lòng giúp đỡ nếu bạn có thể cho các câu hỏi liên quan trong mongoDB - stackoverflow.com/questions/61067856/
mẹo

66

Tôi cần một số hoạt động bổ sung dựa trên kết quả của hàm tổng hợp. Cuối cùng, tôi đã tìm thấy một số giải pháp cho hàm tổng hợp và thao tác dựa trên kết quả trong MongoDB. Tôi có một bộ sưu tập Requestvới lĩnh vực request, source, status, requestDate.

Nhóm đơn theo & Count:

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

Nhiều nhóm theo & Count:

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

Nhiều nhóm theo & đếm với Sắp xếp sử dụng Trường:

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

Nhiều nhóm theo & Count với Sắp xếp sử dụng Count:

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

50

Nếu bạn cần nhiều cột để nhóm theo, hãy làm theo mô hình này. Ở đây tôi đang tiến hành đếm bằng statustype:

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

2
_id đại diện cho một tham số mặc định để đóng gói nhiều trường?
Eugen Sunic

18

Ngoài ra, nếu bạn cần hạn chế việc phân nhóm, bạn có thể sử dụng:

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

17

Bắt đầu trong MongoDB 3.4, bạn có thể sử dụng $sortByCounttổng hợp.

Nhóm các tài liệu đến dựa trên giá trị của một biểu thức đã chỉ định, sau đó tính số lượng tài liệu trong mỗi nhóm riêng biệt.

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

Ví dụ:

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

2
Có lẽ đáng chú ý ở đây $sortByCountthực sự là một "toán tử giả" giống như một số toán tử giai đoạn tổng hợp khác được giới thiệu từ MongoDB 3.4. Tất cả những gì họ thực sự làm là mở rộng vào các giai đoạn tổng hợp tương ứng của họ. Trong trường hợp này a $groupvới $sum: 1như thể hiện trong các câu trả lời hiện có và một $sort giai đoạn bổ sung . Họ không cung cấp lợi thế nào ngoài "gõ ít mã hơn" , điều này có thể hoặc không thể mô tả nhiều hơn (nếu bạn thuộc loại đó). IMHO, khác biệt $groupvà các $sortgiai đoạn trong mã được mô tả nhiều hơn và thực sự linh hoạt hơn.
Neil Lunn


0

Lệnh shell Mongo làm việc cho tôi:

db.getCollection(<collection_name>).aggregate([{"$match": {'<key>': '<value to match>'}}, {"$group": {'_id': {'<group_by_attribute>': "$group_by_attribute"}}}])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.