猫鼬更新数组对象中的字段

Lin*_*yen 4 mongoose mongodb node.js

我正在使用 mongoose findOneAndUpdate() 在 mongodb 中,我有一个包含数组内对象的数据库,如下所示:

病人模型

{
        "_id" : ObjectId("5cb939a3ba1d7d693846136c"),
        "myArray" : [
            {
                "name" : "PW6178281935-20190425",
                "treatment" : "beauty",
                "value" : 0 <- i want to update this
            },
            {
                "name" : "PW6178281935-24142444",
                "treatment" : "muscle",
                "value" : 0
            }
        ] 
},
 {
        "_id" : ObjectId("5cc123a3bb2d3123a932475f"),
        "myArray" : [
            {
                "name" : "PW6178281935-43535555",
                "treatment" : "helps",
                "value" : 0 
            },
            {
                "name" : "PW6178281935-92732978",
                "treatment" : "documents",
                "value" : 0
            }
        ] 
}
Run Code Online (Sandbox Code Playgroud)

我想更新一个对象的值,处理 = "beauty" of _id = "5cb939a3ba1d7d693846136c"

在架构“值”的默认值为 0

我试过这个,但价值没有得到更新

patients.findOneAndUpdate({$and:[{'patients._id' : 5cb939a3ba1d7d693846136c}, {'myArray.treatment' : beauty}]}, { $set: { 'myArray.$.value': 424214 } }, { new: true });
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?

编辑

Frank Rose 的回答是正确的,arrayFilters 对我不起作用的原因是我正在使用的项目使用 mongoose 4.4,它不支持 mongoDB 的 arrayFilters。如果你想在你的项目中使用 arrayFilters,请使用 mongoose 版本5 或更高版本。升级到 mongoose 5.5 后,我可以编辑对象

小智 13

您的查询未按预期工作的原因是您实际上并未针对要更新的特定数组元素。

下面是我将如何编写查询:

 patients.findOneAndUpdate(
  {_id: "5cb939a3ba1d7d693846136c"},
  {$set: {"myArray.$[el].value": 424214 } },
  { 
    arrayFilters: [{ "el.treatment": "beauty" }],
    new: true
  }
)
Run Code Online (Sandbox Code Playgroud)

分解正在发生的事情:

1) 首先,我们通过 ID 寻找患者

2)然后使用$set我们指定正在应用哪些更新。注意$[el]语法。这是指数组中的单个元素。您可以随意命名它,但它必须与arrayFilters.

3) 然后在配置对象中我们指定arrayFilterswhich 只针对“treatment”等于“beauty”的目标数组元素

但请注意,它将以等于“beauty”的处理为目标并更新所有数组元素。如果您还没有,您需要确保处理值是唯一的。$addToSet在这里可能很有用,并且会在数组添加元素时使用。