猫鼬更新数组

时间:2019-04-25 04:01:34

标签: node.js mongodb 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
            }
        ] 
}

我想使用_id =“ 5cb939a3ba1d7d693846136c”的“ =“美容”“来更新对象的值

模式“值”中的

的默认值为0

我已经尝试过了,但是值没有更新

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

我做错什么了吗?

编辑

弗兰克·罗斯(Frank Rose)的答案是正确的,原因arrayFilters对我不起作用,因为我正在使用mongoose 4.4进行的项目尚不支持mongoDB的arrayFilters.If你想在项目中使用arrayFilters使用猫鼬版本5或更高版本。升级到猫鼬5.5后,我可以编辑对象

2 个答案:

答案 0 :(得分:2)

您的查询无法按预期运行的原因是因为您实际上没有针对要更新的特定数组元素。

这是我编写查询的方式:

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

要分解正在发生的事情:

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

2)然后使用$set指定正在应用的更新。注意$[el]语法。这是指数组中的单个元素。您可以根据需要随意命名,但必须与arrayFilters中使用的变量名匹配。

3)然后,在配置对象中,我们指定arrayFilters,即仅针对具有“ beauty”等于“ beauty”的目标数组元素

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

答案 1 :(得分:0)

好吧,我发现并设法进行了更新,但是Frank Rose的正确答案更好,因为它适用于我的其他项目,但不适用于当前项目

我更新后的功能在这里:

patients.findOneAndUpdate(
  {
    _id: "5cb939a3ba1d7d693846136c",
    'images.treatment': "beauty"
  },
  {$set: {"myArray.$.value": 424214 } },
  { 
    new: true
  }
)