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

Nhóm MongoDB và Trừ các giá trị từ các tài liệu khác nhau

Điều bạn cần đầu tiên là $sum có điều kiện dựa trên $cond toán tử trong nhóm cho mỗi giá trị. Sau đó, bạn có thể $subtract một cách riêng biệt :

db.gas.aggregate([
    { "$group": {
        "_id": "$timestamp",
        "gas-in": { 
            "$sum": { 
                "$cond": [
                    { "$eq": [ "$sensor", "gas-in" ] },
                    "$value", 
                    0
                ]
            }
        },
        "gas-out": { 
            "$sum": { 
                "$cond": [
                    { "$eq": [ "$sensor", "gas-out"] },
                    "$value", 
                    0
                ]
            }
        },
    }},
    { "$project": {
        "gasdifference": { "$subtract": [ "$gas-in", "$gas-out" ] }
    }}
])

Điều này mang lại kết quả:

{ "_id" : ISODate("2015-09-17T21:20:35Z"), "gasdifference" : 5.5 }
{ "_id" : ISODate("2015-09-17T21:14:35Z"), "gasdifference" : 0.5 }

Phương pháp thay thế chỉ là làm cho các giá trị "hết gas" âm cho một giai đoạn duy nhất:

db.gas.aggregate([
    { "$group": {
        "_id": "$timestamp",
        "gasdifference": { 
            "$sum": { 
                "$cond": [
                    { "$eq": [ "$sensor", "gas-in" ] },
                    "$value", 
                    { "$subtract": [ 0, "$value" ] }
                ]
            }
        }
    }}
])

Và điều đó sẽ hiệu quả hơn.

Nếu bạn có nhiều hơn hai giá trị "cảm biến" có thể có thì bạn chỉ cần "lồng" $cond tuyên bố:

db.gas.aggregate([
    { "$group": {
        "_id": "$timestamp",
        "gasdifference": { 
            "$sum": { 
                "$cond": [
                    { "$eq": [ "$sensor", "gas-in" ] },
                    "$value", 
                    { "$cond": [
                        { "$eq": [ "$sensor", "gas-out" ] },
                        { "$subtract": [ 0, "$value" ] },
                        0
                    ]}
                ]
            }
        }
    }}
])

Vì chúng là toán tử "bậc ba" (if-then-else) nên bất kỳ logic nào khác đều nằm trong điều kiện "else".




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Lập bản đồ - Tài liệu nhúng Mongodb trong Symfony2

  2. MongoDB DBRef TRÊN XÓA CASCADE

  3. Chỉ định nhiều tiêu chí trong truy vấn db mùa xuân mongo

  4. IP danh sách trắng mongoDB

  5. Làm cách nào để thực hiện tìm kiếm có điều kiện trong pymongo?