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

Mongo Aggregation:mảng $ group và $ project thành đối tượng để đếm

Với MongoDb 3.4 và mới hơn, bạn có thể tận dụng việc sử dụng $arrayToObject toán tử để có được kết quả mong muốn. Bạn sẽ cần chạy đường dẫn tổng hợp sau:

db.collection.aggregate([
    { "$group": {
        "_id": {  
            "date": "$install_date",  
            "platform": { "$toLower": "$platform" }
        },
        "count": { "$sum": 1 }
    } },
    { "$group": {
        "_id": "$_id.date",
        "counts": {
            "$push": {
                "k": "$_id.platform",
                "v": "$count"
            }
        }
    } },
    {  "$addFields": {
        "install_date": "$_id", 
        "platform": { "$arrayToObject": "$counts" }
    }  },
    { "$project": { "counts": 0, "_id": 0 } } 
])

Đối với các phiên bản cũ hơn, hãy tận dụng lợi thế của $cond toán tử trong $group bước quy trình để đánh giá số lượng dựa trên giá trị trường nền tảng, giống như sau:

db.collection.aggregate([    
    { "$group": { 
        "_id": "$install_date",             
        "android_count": {
            "$sum": {
                "$cond": [ { "$eq": [ "$platform", "android" ] }, 1, 0 ]
            }
        },
        "ios_count": {
            "$sum": {
                "$cond": [ { "$eq": [ "$platform", "ios" ] }, 1, 0 ]
            }
        },
        "facebook_count": {
            "$sum": {
                "$cond": [ { "$eq": [ "$platform", "facebook" ] }, 1, 0 ]
            }
        },
        "kindle_count": {
            "$sum": {
                "$cond": [ { "$eq": [ "$platform", "kindle" ] }, 1, 0 ]
            }
        } 
    } },
    { "$project": {
        "_id": 0, "install_date": "$_id",            
        "platform": {
            "android": "$android_count",
            "ios": "$ios_count",
            "facebook": "$facebook_count",
            "kindle": "$kindle_count"
        }
    } }
])

Trong phần trên, $cond nhận một điều kiện logic làm đối số đầu tiê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 làm cho trả về true / false thành 1 và 0 để cấp dữ liệu cho $sum tương ứng.

Ví dụ:if { "$eq": [ "$platform", "facebook" ] }, là true thì biểu thức sẽ đánh giá thành { $sum: 1 } nếu không nó sẽ là { $sum: 0 }




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để thêm id duy nhất hai cột vào mongodb trong ứng dụng sao băng?

  2. Chuẩn hóa MongoDB, khóa ngoại và tham gia

  3. Cách tạo chỉ mục với tên cụ thể trong MongoDB

  4. Sử dụng bản đồ / thu nhỏ để ánh xạ các thuộc tính trong một bộ sưu tập

  5. Cách phát triển ứng dụng cho MongoDB và Redpanda bằng Docker Compose