Mongoose - 将值推送到嵌套在 object 中的数组,该数组嵌套在数组中
Mongoose - Push value to array which is nested in object which is nested in array
不幸的是,我只能在 Whosebug 上找到非常具体的问题,而在文档中找不到确切的细节,所以这里是一个更通用的示例,可能对其他人也有帮助。
我只想向 object 中的数组 (arr) 添加一个值,其中包含“title: 'title3”。
{
_id: <id>,
prop1: val1,
prop2: val2,
prop3: [
{
title: 'title1',
arr: ['val1', 'val2', 'val3'],
},
{
title: 'title2',
arr: ['val1', 'val2', 'val3'],
},
{
title: 'title3',
arr: ['val1', 'val2', 'val3'], //only update this array
}
]
}
我目前的方法是这样的:
SomeModel.findOneAndUpdate(
{ _id: id, "prop3.title": "title3" },
{$push: { "prop3.$[].arr": someDoc._id.toString() }},
(err, doc) => {
if (err) {
console.log('Error updating doc: ', err);
resolve(false);
} else {
resolve(doc);
}
}
);
然而,这里的问题是,不仅在标题为“title3”的 object 的数组中添加了一个值,而且在所有地方都添加了一个值。
如何将一个值专门添加到 object 中标题值为“title3”的数组?
我也将非常感谢链接到解释这一点的文档。
这是一种解决方案,在您的整个上下文中可能有意义,也可能没有意义。
如果使用 mongoose
Document.save() 方法,您的运气会好得多。获得文档的本地副本后,您可以简单地推送到数组:
const doc = await SomeModel.findOne({
_id: id,
"prop3.title": "title3"
});
doc.prop3[3].arr.push(item);
await doc.save();
您可以使用位置 $
运算符以这种方式在单个操作中完成:
使用 $ 告诉 mongo“更新在查找阶段找到的对象”。在这种情况下,“更新 prop3.title
为 title3
的对象”。
请注意,您使用的是 arrayFilters 而不是位置运算符。
db.collection.update({
"_id": 1,
"prop3.title": "title3"
},
{
"$push": {
"prop3.$.arr": "val4"
}
})
示例here
不幸的是,我只能在 Whosebug 上找到非常具体的问题,而在文档中找不到确切的细节,所以这里是一个更通用的示例,可能对其他人也有帮助。
我只想向 object 中的数组 (arr) 添加一个值,其中包含“title: 'title3”。
{
_id: <id>,
prop1: val1,
prop2: val2,
prop3: [
{
title: 'title1',
arr: ['val1', 'val2', 'val3'],
},
{
title: 'title2',
arr: ['val1', 'val2', 'val3'],
},
{
title: 'title3',
arr: ['val1', 'val2', 'val3'], //only update this array
}
]
}
我目前的方法是这样的:
SomeModel.findOneAndUpdate(
{ _id: id, "prop3.title": "title3" },
{$push: { "prop3.$[].arr": someDoc._id.toString() }},
(err, doc) => {
if (err) {
console.log('Error updating doc: ', err);
resolve(false);
} else {
resolve(doc);
}
}
);
然而,这里的问题是,不仅在标题为“title3”的 object 的数组中添加了一个值,而且在所有地方都添加了一个值。
如何将一个值专门添加到 object 中标题值为“title3”的数组? 我也将非常感谢链接到解释这一点的文档。
这是一种解决方案,在您的整个上下文中可能有意义,也可能没有意义。
如果使用 mongoose
Document.save() 方法,您的运气会好得多。获得文档的本地副本后,您可以简单地推送到数组:
const doc = await SomeModel.findOne({
_id: id,
"prop3.title": "title3"
});
doc.prop3[3].arr.push(item);
await doc.save();
您可以使用位置 $
运算符以这种方式在单个操作中完成:
使用 $ 告诉 mongo“更新在查找阶段找到的对象”。在这种情况下,“更新 prop3.title
为 title3
的对象”。
请注意,您使用的是 arrayFilters 而不是位置运算符。
db.collection.update({
"_id": 1,
"prop3.title": "title3"
},
{
"$push": {
"prop3.$.arr": "val4"
}
})
示例here