mongodb 仅当数组中的字段存在时才通过mongo查询更新该字段

6tqwzwtp  于 2023-01-08  发布在  Go
关注(0)|答案(1)|浏览(114)

我试图更新数组中的一个字段,但是如果这个字段不存在,使用$set会添加它,如何避免呢?这是我的模型:

[
  {
    "config": {
      "isEnabled": false,
      "test": {
        "sub": [
          {
            "sub": [
              {},
              {},
              {},
              {},
              {
                "k": "l"
              }
            ]
          },
          {
            "sub": [
              {},
              {},
              {},
              {},
              {
                "k": "l"
              }
            ]
          },
          {
            "sub": [
              {},
              {},
              {},
              {}
            ]
          }
        ]
      }
    }
  },
]

下面是我正在运行的查询

db.collection.update({
  "config.isEnabled": false
},
{
  "$set": {
    "config.test.sub.$[].sub.4": {
      "b": "l"
    }
  }
})

输出:

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "config": {
      "isEnabled": false,
      "test": {
        "sub": [
          {
            "sub": [
              {},
              {},
              {},
              {},
              {
                "b": "l"
              }
            ]
          },
          {
            "sub": [
              {},
              {},
              {},
              {},
              {
                "b": "l"
              }
            ]
          },
          {
            "sub": [
              {},
              {},
              {},
              {},
              {
                "b": "l"
              }
            ]
          }
        ]
      }
    }
  }
]

但我想达到这样的结果:

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "config": {
      "isEnabled": false,
      "test": {
        "sub": [
          {
            "sub": [
              {},
              {},
              {},
              {},
              {
                "b": "l"
              }
            ]
          },
          {
            "sub": [
              {},
              {},
              {},
              {},
              {
                "b": "l"
              }
            ]
          },
          {
            "sub": [
              {},
              {},
              {},
              {},
              {
                "b": "l"
              }
            ]
          }
        ]
      }
    }
  }
]

如果您观察到模型数组中第三个元素的最后一个元素,它不包含k=l,因此我不想在数组的最后一个元素中设置该字段
也就是说,在模型中,这是一个元素:

{
   "sub": [
    {},
    {},
    {},
    {}
   ]
}

当我运行查询时,它会将该元素更新为:

{
   "sub": [
    {},
    {},
    {},
    {},
    {
     "b": "l"
    }
   ]
}

但我不希望它更新该元素
MongoPlayground链接:Mongo Playground For The Above Example
如果这能在 Mongoose 身上实现,那也行
谢谢你的时间,我很感激任何帮助
我尝试使用addToSet和setOnInsert,但都不起作用,我知道我可以找到文档,然后手动添加一些逻辑来适当地更新字段,然后更新文档,但我想知道是否有一种方法可以通过mongo查询实现

8qgya5xd

8qgya5xd1#

一个选项是使用$[<identifier>]

db.collection.update(
  {"config.isEnabled": false},
  {$set: {"config.test.sub.$[item].sub.4": {"b": "l"}}},
  {arrayFilters: [{"item.sub.4": {$exists: true}}]}
)

了解它在playground example上的工作原理

相关问题