如何在猫鼬的另一个数组内更新特定数组的对象?

时间:2020-04-28 22:55:52

标签: arrays mongodb mongoose mern

我有一个这样的架构:

const NoteClusterSchema = new Schema({
   noteInfo: [{
        title: String,
        Description: String,
        authors:[{
          name: String, Id: String
        }]
   }],
   idGroup: String //this is the group of the people that are working on the proyect
}, {timestamps:true});

一个noteInfo的例子是

noteInfo: [{
  title: "Hello",
  Description: "Hello World",
  authors:[
     {name: "Marcelo", id: "1234123123"},
     {name: "Pancho", id: "12341345344"}
  ]
}]

例如,如何在authors数组中专门更新“ Marcelo”的名称? (假设是用户更改了它的名称。我知道在这种情况下,我可以只输入_id,但在我的实际模式中,它不是用户要更新的东西)

我想到了这样的东西:

await NoteClusterSchema.updateMany({idGroup: req.body.idGroup}, 
                {
                    noteInfo: {$push: {authors: {name: 
                    req.body.name}}}
             })

但是以这种方式,它不会知道所有noteInfo数组中的哪个会更新,或者它将创建一个新的authors数组,并且更改noteInfo: {$push: $push: {noteInfo:只会创建一个新的noteInfo数组。

那么,我该如何使用UpdateMany方法更新另一个数组中某个数组中的特定对象?

1 个答案:

答案 0 :(得分:1)

带有 $ set 选项的

findOneAndUpdate应该可以解决您的问题:

NoteClusterSchema.findOneAndUpdate(
    {idGroup: req.body.idGroup},
    {$set: {"noteInfo.$[element].value": "YOUR_NEW_NAME" } },
    {
        arrayFilters: [{ "element.name": "Marcelo" }],
        new: true
    }
)

注意:您必须添加arrayFilters选项才能定位数组中的特定元素。

https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/