sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB Group a odečtení hodnot z různých dokumentů

Nejprve potřebujete podmíněný $sum na základě $cond operátor v seskupení pro každou hodnotu. Poté můžete samostatně $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" ] }
    }}
])

Což dává výsledky:

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

Alternativou je pouze nastavit záporné hodnoty "plyn-out" pro jeden stupeň:

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

A to bude efektivnější.

Pokud máte více než dvě možné hodnoty "sensor", pak stačí "vnořit" $cond prohlášení:

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

Protože se jedná o "ternární" operátory ( if-then-else ), pak jakákoli další logika spadá pod podmínku "else".




  1. Selhání zpracování MongoDB vložení v Javě

  2. Dotazování na existenci vnořeného seznamu v Mongo

  3. Redis / Node.js – 2 klienti (1 pub/sub) způsobující problémy se zápisy

  4. mongo - nelze se připojit k serveru 127.0.0.1:27017