MongoDB查询以公式更新集合中文档的每个字段

时间:2019-01-17 05:16:45

标签: mongodb

我在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。有人可以帮我创建此查询吗?

2 个答案:

答案 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查询