MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Grup MongoDB dan Kurangi Nilai dari Berbagai Dokumen

Yang pertama Anda butuhkan adalah $sum bersyarat berdasarkan $cond operator dalam pengelompokan untuk setiap nilai. Kemudian Anda dapat secara terpisah $subtract :

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" ] }
    }}
])

Yang memberikan hasil:

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

Alternatifnya hanya membuat nilai "gas-out" menjadi negatif untuk satu tahap:

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

Dan itu akan lebih efisien.

Jika Anda memiliki lebih dari dua kemungkinan nilai "sensor" maka Anda cukup "menyarangkan" $cond pernyataan:

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

Karena mereka adalah operator "ternary" ( if-then-else ) maka logika selanjutnya termasuk dalam kondisi "else".




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cara yang tepat untuk mengimpor file json ke mongo

  2. Kapan menggunakan Singleton vs Transient vs Request menggunakan Ninject dan MongoDB

  3. Mengurutkan berdasarkan bidang array maksimum, naik atau turun

  4. Cara menggunakan nilai bidang sebagai nama kunci dalam hasil Mongodb

  5. perbarui dengan id tidak berfungsi di luwak