sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB Group och subtrahera värden från olika dokument

Det du först behöver är en villkorad $sum baserat på $cond operatorn i grupperingen för varje värde. Sedan kan du separat $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" ] }
    }}
])

Vilket ger resultatet:

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

Alternativet är att bara göra "gas-ut"-värdena negativa för ett enda steg:

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

Och det kommer att bli mer effektivt.

Om du har fler än två möjliga "sensor"-värden så "kapslar" du bara $cond uttalanden:

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

Eftersom de är "ternära" operatorer ( if-then-else ) faller all ytterligare logik inom villkoret "annat".




  1. mongodb:lagra en hierarkisk trädstruktur?

  2. En guide till MongoDB-distribution och underhåll med Puppet:Del 1

  3. SignalR kan inte ansluta till Azure Redis på SSL

  4. Dynamisk klibbig sortering i Mongo för ett enkelt värde eller lista