我在MongoDB
集合中有5个文档,它们将温度值存储在Celsius
中。我需要创建一个查询,以便可以将每个值转换为Fahrenheit
。该文件采用以下格式:
{
"_id" : ObjectId("5c3eecfb5c4d120a7c4f5deb"),
"sensorType" : "temperature",
"sensorData" : [
{
"time" : "2018-08-31T19:32:15Z",
"value" : 16
},
{
"time" : "2018-08-31T19:47:21Z",
"value" : 18
},
{
"time" : "2018-08-31T20:02:21Z",
"value" : 23
},
{
"time" : "2018-08-31T20:17:21Z",
"value" : 19
},
它具有时间和值,我需要将值转换为完整的sensorData
。
要解决此问题,我从以下查询开始:
db.sensordata.updateMany(
{ sensorType: "temperature" },
{
$set: { "sensorData.$[].value": 8*2 },
}
)
在上面的查询中,我选择sensorType
作为temperature
,因为该集合还包含其他sensorType
。在$set
中,我只是使用一个简单的公式8*2
来检查查询是否有效。通过运行上述查询,所有值都更新为16
,但是我无法首先获取当前值,然后进行数学运算以将其转换为fahrenheit
。下面是我们可以使用的公式:
celsius * 9/5 + 32
我也尝试了以下查询,但它给了我错误:
db.sensordata.updateMany(
{ sensorType: "temperature"},
{
$set:{"sensorData.$[].value": "($sensorData.value * 9/5) + 32"}
})
但不进行转换而是将值另存为($sensorData.value * 9/5) + 32
。有人可以帮我创建此查询吗?
答案 0 :(得分:0)
我找到了解决方案,但这需要两个步骤:
第1步:运行查询以乘以9/5
db.sensordata.update(
{
sensorType: "temperature"
},
{
$mul: { "sensorData.$[].value": 9/5 }
},
{ multi:true}
)
第2步:增加32个(添加)结果,如下所示:
db.sensordata.update(
{
sensorType: "temperature"
},
{
$inc: { "sensorData.$[].value": 32 }
},
{ multi:true }
)
答案 1 :(得分:0)
$ set中不能有多个。 但是不是将其转换为将值另存为($ sensorData.value * 9/5)+ 32->这是正确的,因为您是在分配该值而不是将该值乘以
您可以执行此操作,但是为此,您需要两个查询
首先,将文档相乘,下面的查询将9/5值乘以现有值
db.sensor.updateMany(
{ sensorType: "temperature"},
{ $mul: {"sensorData.$[].value": 9/5}}
)
然后递增文档,下面的查询将32值添加到现有值
db.sensor.updateMany(
{ sensorType: "temperature"},
{ $inc: {"sensorData.$[].value": 32}}
)
快乐的Mongodb查询