gpt4 book ai didi

MongoDB 分组并从不同文档中减去值

转载 作者:可可西里 更新时间:2023-11-01 10:00:37 25 4
gpt4 key购买 nike

在我的申请中我有以下文件

{
"timestamp": ISODate("2015-09-17T21:14:35.0Z"),
"sensor": "gas-in",
"value": 2.5,
},
{
"timestamp": ISODate("2015-09-17T21:14:35.0Z"),
"sensor": "gas-out",
"value": 2.0,
},
{
"timestamp": ISODate("2015-09-17T21:20:35.0Z"),
"sensor": "gas-in",
"value": 6.3,
},
{
"timestamp": ISODate("2015-09-17T21:20:35.0Z"),
"sensor": "gas-out",
"value": 0.8,
}

...等...

如何返回差异(gas-in)-(gas-out)按时间戳分组?我正在尝试编写一个像这样返回它的函数:

{
"timestamp": ISODate("2015-09-17T21:14:35.0Z"),
"sensor": "gas-difference",
"value": 0.5, // is calculated by 2.5 - 2.0
},
{
"timestamp": ISODate("2015-09-17T21:20:35.0Z"),
"sensor": "gas-difference",
"value": 5.5, // is calculated by 6.3 - 0.8
},

...等...

我玩过聚合函数和 $subtract,阅读了其他 SO 问题,但它们似乎没有我的问题的答案。在其他问题中,他们似乎知道要从哪个文件中减去 2 个文件,但在我的情况下,我不知道文件的数量,$timestamp“列”是两个文件的匹配标识符。

谁能帮我解决这个问题?谢谢!

最佳答案

您首先需要的是条件 $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”条件。

关于MongoDB 分组并从不同文档中减去值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32839808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com