我正在尝试使用ExpressJS更新Mongoose中的嵌套子文档,但似乎无法正常工作。位置alert( "Value = "+ data.UserID );
的运算符不能遍历1个以上的级别,我尝试使用$
,但似乎也无法正常工作。
这是文档:
arrayFilters
猫鼬模型:
{
"_id" : ObjectId("5c52b017d9133d14876d2493"),
"title" : "main_item",
"subitem" : [
{
"_id" : ObjectId("5c52f4e74ef7482a646fc264"),
"title" : "sub_item",
"messages" : [
{
"_id" : ObjectId("5c5303fa4b20df2d33d6eb08"),
"type" : "single_article",
"date" : "Jan 31, 2019",
"title" : "item",
"text" : "<p>item text</p>"
},
{
"_id" : ObjectId("5c53040b4b20df2d33d6eb09"),
"type" : "single_article",
"date" : "Jan 31, 2019",
"title" : "item 2",
"text" : "<p>item 2 text</p>"
}
]
}
],
"__v" : 0
}
postController.updateMessage = function(req, res, item) {
var id = req.body.id;
var sub_id = req.body.sub_id;
var saveData = {
title: req.body.title,
text: req.body.text
};
item.updateOne({'subitem._id': id}, {$set: {'subitem.$[el1].messages.$[el2]': saveData}}, {arrayFilters:[{"el1._id": id},{"el2._id": sub_id}]})
};
答案 0 :(得分:1)
我不知道如何准确解决您的问题是否有答案,但是我将推荐一种解决方案,我认为该解决方案可以显着提高代码中的组织水平...
(1)首先,每个模式都应导出为单独的模型(我建议它们分别位于单独的文件中)
(2)其次,在您的subitems
和menuItems
模式中,创建消息和子项引用。如果您遵循我提出的第一个建议,则可以使menuItems模式如下:
menuItems.js
const menuItems = new mongoose.Schema({
title : String,
subitem: {
type: mongoose.Types.ObjectId,
ref: 'sub_items'
}
});
module.exports = mongoose.model("menu_items", menuItems);
sub_items
是导出的子项目模型的名称。在您的子项目模型中也使用类似的格式,但是我会让您这样做,因为我不想偷所有的乐趣;)
(3)现在,这些都是引用,当您需要更改menuItem引用的子项时,只需更新实际的子项。您不再需要通过菜单项对象 来更新子项,因为对子项的引用不会改变!
我希望这会有所帮助。现在,它应该对您来说井井有条,并且非常更容易更新您的子项和子消息