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

Posted

技术标签:

【中文标题】猫鼬更新数组对象中的字段【英文标题】:mongoose update a field in an object of array 【发布时间】:2019-09-14 10:25:16 【问题描述】:

我正在使用猫鼬 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。如果你想在你的项目中使用 arrayFilters使用猫鼬版本 5 或更高版本。升级到猫鼬 5.5 后,我能够编辑对象

【问题讨论】:

【参考方案1】:

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

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

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

分解正在发生的事情:

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

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

3) 然后在配置对象中我们指定arrayFilters,即只针对“治疗”等于“美”的数组元素

请注意,它会定位并更新所有具有等于“美”的处理的数组元素。如果您还没有,您需要确保治疗值是唯一的。 $addToSet 在这里可能很有用,并且会在向数组添加元素时使用。

【讨论】:

感谢您的详细描述,但对象中的值仍然没有改变,如果在架构中设置值 default: 0 是否会影响? 我刚刚尝试在本地运行查询,它更新了正确的数组元素。我使用您提供的两个模型作为集合中仅有的两个文档。不,我看不出默认值将如何导致更新出现问题,这仅在首次创建文档并且未提供任何值时才重要。我不确定为什么它没有为您正确更新问题可能出在您代码的其他地方。 我在 mongo shell 上测试了查询,它工作正常,可能是我的代码有问题。【参考方案2】:

好的,我发现并设法更新了,但 Frank Rose 的正确答案更好,因为它在我的其他项目中有效,但在当前项目中无效

因为我用的是mongoose 4.4版本,所以只有5及以上版本可以使用arrayfilter

对于猫鼬版本

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

【讨论】:

以上是关于猫鼬更新数组对象中的字段的主要内容,如果未能解决你的问题,请参考以下文章

更新猫鼬文档中另一个数组内的数组中的字段

如何使用猫鼬更新数组中的现有对象

嵌入式数组中的猫鼬更新对象

批量更新猫鼬对象中的数组

猫鼬,对象中的数组

使用投影或选择更新猫鼬文档中对象数组内的对象