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

Mongodb - truy vấn tổng của ngày hôm nay, tổng của tuần và tổng của tháng trong một truy vấn

Đây thực sự là một câu hỏi về việc bạn mong đợi kết quả trông như thế nào, vì bất kỳ kết quả tổng hợp nào về cơ bản đều cần phải nhóm ở mức thấp nhất và sau đó nhóm dần dần ở các "hạt" cao hơn cho đến khi đạt được mức lớn nhất ("tháng"). Loại này ngụ ý dữ liệu cuối cùng được nhóm theo "tháng", trừ khi bạn chia nhỏ dữ liệu theo cách khác.

Về bản chất, dần dần $group :

db.collection.aggregate([
    // First total per day. Rounding dates with math here
    { "$group": {
        "_id": {
            "$add": [
                { "$subtract": [
                    { "$subtract": [ "$createdAt", new Date(0) ] },
                    { "$mod": [
                        { "$subtract": [ "$createdAt", new Date(0) ] },
                        1000 * 60 * 60 * 24
                    ]}                        
                ]},
                new Date(0)
            ]
        },
        "week": { "$first": { "$week": "$createdAt" } },
        "month": { "$first": { "$month": "$createdAt" } },
        "total": { "$sum": "$num" }
    }},

    // Then group by week
    { "$group": {
        "_id": "$week",
        "month": { "$first": "$month" },
        "days": {
            "$push": {
                "day": "$_id",
                "total": "$total"
            }
        },
        "total": { "$sum": "$total" }
    }},

    // Then group by month
    { "$group": {
        "_id": "$month",
        "weeks": {
            "$push": {
                "week": "$_id",
                "total": "$total",
                "days": "$days"
            }
        },
        "total": { "$sum": "$total" }
    }}
])

Vì vậy, mỗi cấp độ sau cấp độ đầu tiên tổng cộng mỗi ngày sau đó được đẩy dần vào nội dung mảng cho giá trị "làm tròn" của nó và các tổng sau đó cũng được tổng hợp ở cấp độ đó.

Nếu bạn muốn đầu ra phẳng hơn với một bản ghi mỗi ngày chứa tổng hàng tuần và hàng tháng cũng như tổng ngày, thì chỉ cần thêm hai $unwind câu lệnh vào cuối đường dẫn:

{ "$unwind": "$weeks" },
{ "$unwind": "$weeks.days" }

Và tùy chọn $project các trường "dấu chấm" cho ra thứ gì đó phẳng hơn và có thể đọc được nếu bạn phải.

Nếu bạn đang kéo dài "năm" với điều này, thì hãy bao gồm thao tác như vậy trong khóa nhóm ít nhất từ ​​cấp "tuần" để bạn không thể kết hợp dữ liệu từ các năm khác nhau và chúng được tách biệt.

Sở thích chung của tôi cũng là sử dụng "toán ngày" cách tiếp cận khi làm tròn ngày vì nó trả về một Date , nhưng khi được sử dụng ở các cấp khác ngoài "day", bạn chỉ có thể luân phiên sử dụng toán tử tổng hợp ngày thay vào đó.

Không cần mapReduce vì điều này khá trực quan và có số ngày hữu hạn trong tháng có nghĩa là giới hạn BSON khi lồng các mảng trong nội dung trong khi tổng hợp sẽ không bị phá vỡ.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. GeoNear trong MongoDB có thể trả về một tập hợp con các trường trong tài liệu không?

  2. MongoDB dropIndex ()

  3. MongoDB $ max

  4. mongoose có hỗ trợ các trường ảo được chọn như SQL không

  5. Kiểm tra xem cơ sở dữ liệu mongodb có tồn tại không?