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

nhóm dữ liệu thu thập theo nhiều trường mongodb

Với khung tổng hợp, kết quả sẽ hơi khác so với đầu ra "mong muốn" của bạn vì thay vì có các khóa băm, bạn nhận được một mảng các đối tượng có _id khóa có giá trị đại diện cho bạn nhóm theo trường. Ví dụ:thay vì

{
    "28-10-2016":{
        "success_count": 10, 
        "failure_count": 10
    },
    "29-10-2016": {
        "success_count": 10, 
        "failure_count": 10
    }
}

bạn sẽ có một cấu trúc tốt hơn như

[
    {
        "_id": "28-10-2016",
        "success_count": 10, 
        "failure_count": 10
    },
        "_id": "29-10-2016",
        "success_count": 10, 
        "failure_count": 10
    }
]

Để đạt được kết quả ở trên sẽ yêu cầu sử dụng $cond toán tử trong $sum toán tử tích lũy. $cond toán tử sẽ đánh giá một điều kiện logic dựa trên đối số đầu tiên của nó (nếu) và sau đó trả về đối số thứ hai trong đó đánh giá là đúng (sau đó) hoặc đối số thứ ba là sai (khác). Điều này chuyển đổi logic đúng / sai thành các giá trị số 1 và 0 cấp vào $sum tương ứng:

"success_count": {
    "$sum": {
        "$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
    }
}

Là một đường dẫn kết quả, một người cần chạy hoạt động tổng hợp sử dụng $dateToString toán tử trong _id biểu thức khóa cho $group đường ống:

Orders.aggregate([
    {
        "$group": {
            "_id": {
                "$dateToString": { 
                    "format": "%Y-%m-%d", 
                    "date": "$created_at" 
                }
            },
            "success_count": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
                }
            },
            "failure_count": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$status", "failure" ] }, 1, 0 ]
                }
            }
        }
    }
], function (err, orders){
    if (err) throw err;
    console.log(orders);
})

Tuy nhiên, có một cách tiếp cận linh hoạt hơn và hoạt động tốt hơn, thực thi nhanh hơn nhiều so với cách trên, trong đó cấu trúc dữ liệu hiệu quả nhất cho kết quả tổng hợp của bạn tuân theo lược đồ, ví dụ:

orders = [
    {
        "_id": "28-10-2016",
        "counts": [
            { "status": "success", "count": 10 },
            { "status": "failure", "count": 10 }
        ]
    },
    {
        "_id": "29-10-2016",
        "counts": [
            { "status": "success", "count": 10 },
            { "status": "failure", "count": 10 }
        ]
    }
]

Sau đó, hãy xem xét chạy một đường dẫn thay thế như sau

Orders.aggregate([
    { 
        "$group": {
            "_id": { 
                "date":  {
                    "$dateToString": { 
                        "format": "%Y-%m-%d", 
                        "date": "$created_at" 
                    }
                },
                "status": { "$toLower": "$status" }
            },
            "count": { "$sum": 1 }
        }
    },
    { 
        "$group": {
            "_id": "$_id.date",
            "counts": {
                "$push": {
                    "status": "$_id.status",
                    "count": "$count"
                }
            }
        }
    }
], function (err, orders){
    if (err) throw err;
    console.log(orders);
})



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để lưu trữ Ngày và Giờ trong Meteor cho các truy vấn phạm vi?

  2. MongoDB - phân trang

  3. Mảng Mongodb $ push và $ pull

  4. Làm cách nào để cập nhật tài liệu nhúng trong mongoose?

  5. Tự động kiểm tra cấu hình cơ sở dữ liệu