MongoDb,如果值为负,则更新任何字段

vwkv1x7d  于 2023-05-28  发布在  Go
关注(0)|答案(2)|浏览(167)

我收集了一些这样的文件:

{
  "_id": "5f7db1c8e3ec502bf2f2c97c",
  "subject": "AA0001",
  "metrics": {
     "m001": 40.8,
     "m0022": 58.8,
     .....
     "m0101: -5.0,
  }
}

“metrics”中的所有字段都是数字。负值是错误的。我想用“NA”替换任何负值。但我有两个问题:

  • 每个文档的负值字段都不同。
  • “metrics”中的字段并不总是相同的。一个文档可以比其他文档具有更多的“度量”。

有什么想法吗

muk1a3rh

muk1a3rh1#

你可以用$objectToArray把metrics对象转换成一个键值对对象数组,然后用$map把它转换成一个数组,如果数字是负数,它将被替换为“NA”,使用一个条件操作。完成转换后,可以使用$arrayToObject将数组转换回对象

db.collection.aggregate([
  {
    $addFields: {
      metrics: {
        $map: {
          input: { $objectToArray: "$metrics" },
          in: {
            k: "$$this.k",
            v: { $cond: [ { $gte: [ "$$this.v", 0 ] }, "$$this.v", "NA" ] }
          }
        }
      }
    }
  },
  {
    $addFields: {
      metrics: { $arrayToObject: "$metrics" }
    }
  }
])

playground
您也可以更新集合以反映这些更改。从Mongo 4.2开始,您可以在update调用中编写聚合管道
$addFields$set可以互换使用

db.collection.update({},
[
  {
    $addFields: {
      metrics: {
        $map: {
          input: { $objectToArray: "$metrics" },
          in: {
            k: "$$this.k",
            v: { $cond: [ { $gte: [ "$$this.v", 0 ] }, "$$this.v", "NA" ] }
          }
        }
      }
    }
  },
  {
    $addFields: {
      metrics: { $arrayToObject: "$metrics" }
    }
  }
],
{
  multi: true
})

playground

agxfikkp

agxfikkp2#

你可以使用下面的代码。

db.collection.updateMany(
  { "metrics": { $exists: true } },
  [
    {
      $set: {
        "metrics": {
          $arrayToObject: {
            $map: {
              input: { $objectToArray: "$metrics" },
              in: {
                k: "$$this.k",
                v: {
                  $cond: {
                    if: { $lt: [ "$$this.v", 0 ] },
                    then: "NA",
                    else: "$$this.v"
                  }
                }
              }
            }
          }
        }
      }
    }
  ]
);

相关问题