使用 mongoose 编辑数组中的多个对象 (MongoDB)

Edit multiple objects in array using mongoose (MongoDB)

所以我尝试了几种方法,但我不能,我可以用相同的键修改几个对象但我不能用不同的键修改任何对象,如果有人能帮助我是一个相当复杂的问题

{ 
  id: 123, 
  "infos": [ 
    { name: 'Joe', value: 'Disabled', id: 0 }, 
    { name: 'Adam', value: 'Enabled', id: 0 }
  ]
};

在我的数据库中,我有一个集合,里面有一个数组和几个对象,它给出了这个。

我想修改这些对象,按名称筛选并修改值。

给你一个更好的例子,我的网站returns我有一个新数据对象,我想用新对象修改数据库对象,不清除数组,名称键永远不会改变.

const object = [
  { name: 'Joe', value: 'Hey', id: 1 }, 
  { name: 'Adam', value: 'None', id: 1 }
];

for(const obj in object) {
  Schema.findOneAndUpdate({ id: 123 }, {
    $set: {
      [`infos.${obj}.value`]: "Test"
    }
  })
}

此代码有效,但未优化,它发出多个请求,我想在一个请求中完成所有操作,而且它不更新 ID,仅更新值。

如果有人能帮助我那就太好了,我到处都找遍了,找不到任何东西

我的模式结构

new Schema({
  id: { "type": String, "required": true, "unique": true }, 
  infos: []
})

我使用$addToSet方法将对象插入infos数组

试试这个:

db.collection.update({
  id: 123,
  
},
{
  $set: {
    "infos.$[x].value": "Value",
    "infos.$[x].name": "User"
  }
},
{
  arrayFilters: [
    {
      "x.id": {
        $in: [ 
          1 
        ]
      }
    },
    
  ],
  multi: true
})
  1. 所有位置 $[] 运算符充当数组字段中所有元素的占位符。

  2. $in中可以使用id的动态array。 例如:

    const ids = [1,2,..n]

    db.collection.update( //Same code as it is... { 数组过滤器:[ { “x.id”:{ $in: ids } }, ], 多:真 })

MongoPlayGround Link : https://mongoplayground.net/p/Tuz831lkPqk

也许您正在寻找这样的东西:

db.collection.update({},
{
  $set: {
   "infos.$[x].value": "test1",
   "infos.$[x].id": 10,
   "infos.$[y].value": "test2",
   "infos.$[y].id": 20
   }
 },
{
 arrayFilters: [
{
  "x.name": "Adam"
},
{
  "y.name": "Joe"
}
],
  multi: true
})

解释:

您为您拥有的对象中的所有名称定义 arrayFilters 并更新所有文档中的值和 ID ...

playground