更新猫鼬中的嵌套子文档

时间:2019-02-04 12:45:19

标签: express mongoose

我正在尝试使用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}]})
};

1 个答案:

答案 0 :(得分:1)

我不知道如何准确解决您的问题是否有答案,但是我将推荐一种解决方案,我认为该解决方案可以显着提高代码中的组织水平...

(1)首先,每个模式都应导出为单独的模型(我建议它们分别位于单独的文件中)

(2)其次,在您的subitemsmenuItems模式中,创建消息和子项引用。如果您遵循我提出的第一个建议,则可以使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引用的子项时,只需更新实际的子项。您不再需要通过菜单项对象 来更新子项,因为对子项的引用不会改变!

我希望这会有所帮助。现在,它应该对您来说井井有条,并且非常更容易更新您的子项和子消息