在不更改对象 ID 的情况下更新嵌套对象数据
update nested Object data without changing Object Id
我目前正在使用数组过滤器来更新嵌套对象。
我的结构是 -
Category Collection -
{
name:Disease,
_id:ObjectId,
subCategory:[{
name:Hair Problems,
_id:ObjectId,
subSubCategory:[{
name: Hair Fall,
_id:ObjectId
},{
name: Dandruff,
_id:ObjectId
}]
}]
}
我想使用数组过滤器更新 ID 为 1.1.1 的子类别。
let query = { 'subCategories.subSubCategories._id': subSubId };
let update = { $set: { 'subCategories.$.subSubCategories.$[j]': data } };
let option = { arrayFilters: [{ 'j._id': subSubId }], new: true };
await Categories.findOneAndUpdate(query, update, option
此代码运行良好,但数组过滤器更改了 subsubCategory 的对象 ID。在不更改 ObjectId 的情况下是否还有其他替代方法。
提前致谢
问题出在 $set
行中,您没有提到要更新的特定字段,而是 subCategory.$.subSubCategory.$[j]
将替换与 _id 过滤器匹配的完整对象元素。因此,您的 _id 字段也会更新。您必须在数组元素标识符之后明确提及字段名称。请参见下面的示例:
假设您要将 subSubCategories
中的 name
字段从 Dandruff
更新为 new Dandruff
。然后这样做:
let update = { $set: { 'subCategories.$.subSubCategories.$[j].name': "new Dandruff" } };
这只会更新 subSubCategories
数组
中的 name
字段
您可以遍历作为有效负载获取的密钥,并将其放入 $set
运算符中。
const data = {
firstKey: "key",
secondKey: "key2",
thirdKey: "key3"
}
const object = {}
for (var key in data) {
object[`subCategories.$.subSubCategories.$[j].${key}`] = data[key]
}
let query = { 'subCategories.subSubCategories._id': subSubId };
let update = { '$set': object };
let option = { 'arrayFilters': [{ 'j._id': subSubId }], 'new': true };
await Categories.findOneAndUpdate(query, update, option)
我目前正在使用数组过滤器来更新嵌套对象。 我的结构是 -
Category Collection -
{
name:Disease,
_id:ObjectId,
subCategory:[{
name:Hair Problems,
_id:ObjectId,
subSubCategory:[{
name: Hair Fall,
_id:ObjectId
},{
name: Dandruff,
_id:ObjectId
}]
}]
}
我想使用数组过滤器更新 ID 为 1.1.1 的子类别。
let query = { 'subCategories.subSubCategories._id': subSubId };
let update = { $set: { 'subCategories.$.subSubCategories.$[j]': data } };
let option = { arrayFilters: [{ 'j._id': subSubId }], new: true };
await Categories.findOneAndUpdate(query, update, option
此代码运行良好,但数组过滤器更改了 subsubCategory 的对象 ID。在不更改 ObjectId 的情况下是否还有其他替代方法。
提前致谢
问题出在 $set
行中,您没有提到要更新的特定字段,而是 subCategory.$.subSubCategory.$[j]
将替换与 _id 过滤器匹配的完整对象元素。因此,您的 _id 字段也会更新。您必须在数组元素标识符之后明确提及字段名称。请参见下面的示例:
假设您要将 subSubCategories
中的 name
字段从 Dandruff
更新为 new Dandruff
。然后这样做:
let update = { $set: { 'subCategories.$.subSubCategories.$[j].name': "new Dandruff" } };
这只会更新 subSubCategories
数组
name
字段
您可以遍历作为有效负载获取的密钥,并将其放入 $set
运算符中。
const data = {
firstKey: "key",
secondKey: "key2",
thirdKey: "key3"
}
const object = {}
for (var key in data) {
object[`subCategories.$.subSubCategories.$[j].${key}`] = data[key]
}
let query = { 'subCategories.subSubCategories._id': subSubId };
let update = { '$set': object };
let option = { 'arrayFilters': [{ 'j._id': subSubId }], 'new': true };
await Categories.findOneAndUpdate(query, update, option)