आपको सबसे पहले एक सशर्त $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" कंडीशन में आता है।