MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB групиране и изваждане на стойности от различни документи

Това, от което първо се нуждаете, е условен $sum въз основа на $cond оператор в групирането за всяка стойност. След това можете отделно $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" ] }
    }}
])

Което дава резултатите:

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

Алтернативата е просто да направите стойностите за "изпускане на газ" отрицателни за един етап:

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

И това ще бъде по-ефективно.

Ако имате повече от две възможни стойности на "сензор", тогава просто "влагате" $cond изявления:

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

Тъй като те са "троични" оператори ( if-then-else ), тогава всяка следваща логика попада в условието "else".




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Използване на $unwind и $text в рамка за агрегиране mongodb

  2. Как се използва IAsyncCursor за итерация с драйвера mongodb c#?

  3. Последици от използването на $unwind върху вложени масиви?

  4. Грешка при свързване на NodeJS с mongoDB

  5. Как да получите списък с бази данни и колекции на mongodb от приложение ruby ​​on rails