【问题标题】:Update nested subdocument in Mongoose更新猫鼬中的嵌套子文档
【发布时间】:2019-02-05 00:15:07
【问题描述】:

我正在尝试使用 ExpressJS 更新 Mongoose 中的嵌套子文档,但我似乎无法使其正常工作。位置 $ 运算符不会遍历超过 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}]})
};

猫鼬模型:

var submessages = mongoose.Schema({
  date: String,
  type: String,
  title: String,
  text: String
});

var subitems = new mongoose.Schema({
  title: String,
  messages: [submessages]
});

var menuItems = new mongoose.Schema({
  title : String,
  subitem: [subitems]
}, {collection: 'menu_items'});

module.exports = mongoose.model("menu_items", menuItems);

【问题讨论】:

  • 你能分享你的模型吗?它可能有助于回答问题
  • 我已经用我的模型编辑了它

标签: express mongoose


【解决方案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 引用的子项时,您只需更新实际的子项。您不再需要通过 menuItem 对象更新子项,因为对子项的引用永远不会改变!

我希望这会有所帮助。它现在应该更有条理,并且应该MUCH更容易更新您的子项目和子消息

【讨论】:

  • 谢谢,这真的很有帮助:)
  • 你知道我如何发布一个子项作为对每个菜单项的引用吗?我是参考文献的新手,我不知道如何使用它
猜你喜欢
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
  • 2012-04-29
相关资源
最近更新 更多