使用 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
})
所有位置 $[]
运算符充当数组字段中所有元素的占位符。
在$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 ...
所以我尝试了几种方法,但我不能,我可以用相同的键修改几个对象但我不能用不同的键修改任何对象,如果有人能帮助我是一个相当复杂的问题
{
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
})
所有位置
$[]
运算符充当数组字段中所有元素的占位符。在
$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 ...