MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Mongodb tổng hợp (đếm) trên nhiều trường đồng thời

Khung tổng hợp sẽ không tạo khóa dựa trên dữ liệu, cũng không nên bạn thậm chí đang làm như vậy vì "dữ liệu" không phải là khóa mà thực sự là dữ liệu, vì vậy bạn nên bám sát vào mẫu.

Điều đó có nghĩa là về cơ bản bạn chỉ có thể làm điều này:

db.data.aggregate([
    { "$group": {
        "_id": {
            "event_type": "$event",
            "day": { "$dayOfWeek": "$date" }
        },
        "count": { "$sum": 1 } 
    }}
])

Và điều đó sẽ tính số lần xuất hiện mỗi ngày trong tuần cho mỗi sự kiện, mặc dù trong nhiều tài liệu trong đầu ra, nhưng điều này dễ dàng thay đổi thành một tài liệu cho mỗi sự kiện:

db.data.aggregate([
    { "$group": {
        "_id": {
            "event_type": "$event",
            "day": { "$dayOfWeek": "$date" }
        },
        "count": { "$sum": 1 } 
    }},
    { "$group": {
        "_id": "$_id.event_type",
        "days": { "$push": { "day": "$_id.day", "count": "$count" } }
    }}
])

Và đó là ở dạng mảng, nhưng nó vẫn giữ kết quả bạn muốn.

Nếu bạn thực sự muốn làm đúng biểu mẫu của mình thì bạn muốn làm điều gì đó như sau:

db.data.aggregate([
    { "$group": {
        "_id": "$event",
        "1": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 1 ] },
                    1,
                    0
                ]
            }
        },
        "2": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 2 ] },
                    1,
                    0
                ]
            }
        },
        "3": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 3 ] },
                    1,
                    0
                ]
            }
        },
        "4": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 4 ] },
                    1,
                    0
                ]
            }
        },
        "5": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 5 ] },
                    1,
                    0
                ]
            }
        },
        "6": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 6 ] },
                    1,
                    0
                ]
            }
        },
        "7": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 7 ] },
                    1,
                    0
                ]
            }
        }
    }}
)

Nhưng điều đó thực sự dài dòng nên IMHO, tôi sẽ gắn bó với giải pháp thứ nhất hoặc có thể là thứ hai vì chúng ngắn hơn và dễ đọc hơn.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Trận chiến của các cơ sở dữ liệu NoSQL - So sánh MongoDB và Cassandra

  2. Mongod phàn nàn rằng không có thư mục / data / db

  3. Hướng dẫn sử dụng MongoDB cho năm 2022 - Tìm hiểu MongoDB là gì?

  4. Chèn Khung dữ liệu gấu trúc vào mongodb bằng PyMongo

  5. Cách tạo chỉ mục văn bản trong MongoDB