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

Cách nhận số lượng nhiều bộ lọc phù hợp trong mongoDB

Rất có thể chỉ trong một lần qua khung tổng hợp .

Với MongoDb 3.6 và mới hơn, bạn có thể tận dụng việc sử dụng $ arrayToObject toán tử trong $ ReplaceRoot để có được kết quả mong muốn.

Trong quy trình, hãy tận dụng $ cond toán tử trong $ group giai đoạn để đánh giá số lượng dựa trên giá trị boolean của trường param, giống như sau:

db.getCollection('patients').aggregate([ 
    { "$project": { "_id": 0 } },
    { "$project": { "data": { "$objectToArray": "$$ROOT" } } },
    { "$unwind": "$data" },
    { "$group": { 
        "_id": "$data.k", 
        "count": { 
            "$sum": {
                "$cond": [ "$data.v", 1, 0 ] 
            }
        } 
    } },
    { "$group": { 
        "_id": null, 
        "counts": { 
            "$push": { "k": "$_id", "v": "$count" } 
        } 
    } }, 
    { "$project": { 
        "data": { "$arrayToObject": "$counts" } 
    } }, 
    { "$replaceRoot": { "newRoot": "$data" } } 
])

Đối với các phiên bản MongoDB không hỗ trợ $ arrayToObject $ ReplaceRoot , bạn sẽ cần chỉ định rõ ràng các trường trong đường dẫn nhóm khi tính tổng:

db.getCollection('patients').aggregate([    
    { "$group": { 
        "_id": null,             
        "param1_count": {
            "$sum": {
                "$cond": [ "$param1", 1, 0 ] /* similar to "$cond": [ { "$eq": [ "$param1", true ] }, 1, 0 ] */
            }
        },
        "param2_count": {
            "$sum": {
                "$cond": [ "$param2", 1, 0 ]
            }
        },
        "param3_count": {
            "$sum": {
                "$cond": [ "$param3", 1, 0 ]
            }
        },
        "param4_count": {
            "$sum": {
                "$cond": [ "$param4", 1, 0 ]
            }
        } 
    } },
    { "$project": {
        "_id": 0,             
        "param_counts": {
            "param1": "$param1_count",
            "param2": "$param2_count",
            "param3": "$param3_count",
            "param4": "$param4_count"
        }
    } }
])



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Truy vấn Mongodb vào tháng, ngày, năm ... của ngày giờ

  2. Triển khai đánh giá đối tượng biểu thức truy vấn giống goMongoDB

  3. MongoDB:Hiệu suất giảm bản đồ khủng khiếp

  4. NodeJS + MongoDB:Lấy dữ liệu từ bộ sưu tập với findOne ()

  5. Tìm nạp từ nhiều bộ sưu tập riêng biệt với Express và MongoDB