mongodb - Mongoose 不会删除嵌入的文档

标签 mongodb node.js express mongoose

我在这里摸不着头脑,就像往常一样, Node 项目似乎是这样,我不确定我是做错了什么还是遇到了错误。

我有一个服务器模式,它可以有任意数量的嵌入式文档,称为服务。我遇到了一个问题,尽管我已经成功地从服务器对象中删除了单个服务,但当我告诉它保存它并没有从数据库中删除它时。保存功能正在工作,因为它保存了我所做的任何更改,并且还在推送新的嵌入式文档,它只是没有删除已经存在的文档。

这是我的代码的一个相对简化的例子:

app.put('/server/:id', function(req, res, next){
  app.Server.findOne({_id: req.params.id}, function(err, server) {
    server.updated = new Date();
    ...

    for (var num = _.size(req.body.server.services) - 1; num >= 0; num--){
      // Is this a new service or an existing one
      if (server.services[num]) {
        // Is it marked for deletion? If so, delete it
        if (req.body.server.services[num].delete == "true") {
          server.services[num].remove()
        } else { // else, update it
          server.services[num].type = req.body.server.services[num].type
          ...
        }
      } else {
        // It's new, add it
        delete req.body.server.services[num]["delete"]
        server.services.push(req.body.server.services[num]);
      }
    }

    server.save(function(err){
      if (!err) {
        req.flash('success', 'Server updated')
      } else {
        req.flash('error', 'Err, Something broke when we tried to save your server. Sorry!')
        console.log(err)
      }
      res.redirect('/')
    });
  })
});

所以 remove() 实际上是在删除服务。如果我在保存之前执行 server.toObject() ,则它不存在。任何想法为什么它不会在保存时将其从数据库中删除?

编辑:我想版本号会有所帮助。 node@0.4.2, mongoose@1.1.5 express@2.0.0rc

最佳答案

我可能是错的,因为我没有测试你的例子,但这听起来像 Mongoose 没有检测到嵌入的文档被修改。

来自schema types documentation page :

由于它是无架构类型,您可以将值更改为您喜欢的任何其他值,但 Mongoose 无法自动检测/保存这些更改。要“告诉”Mongoose Mixed 类型的值已更改,请调用文档的 .markModified(path) 方法,将路径传递给刚刚更改的 Mixed 类型。

person.anything = { x: [3, 4, { y: "changed" }] };
person.markModified('anything');
person.save(); // anything will now get saved

所以你的回答可能就像使用 markModified() 函数一样简单。

关于mongodb - Mongoose 不会删除嵌入的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5316709/

相关文章:

javascript - 在 node express 上包含 css 和 JavaScript 文件

python - 将 JSON 对象从 requests.get() 转换为字典

javascript - Node.js/Mongoose 类型错误

node.js - 如何通过Electron注册JS对象?

node.js - Node - 简单的 xml API 请求

javascript - 如何执行 Mongoose 验证功能仅用于创建用户页面而不编辑用户页面?

c# - Mongodb C# 批量更新/替换子集合

MongoDB:通过多个条件查询嵌套数组

javascript - 不要包含使用 node-tar 进行存档的绝对路径

node.js - 主要 Node.js 文件存在哪些命名约定?