我像往常一样在这里挠头,似乎在节点项目中,我不确定我是否做错了什么,或者我是否遇到了错误。

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

这是我的代码相对简化的示例:

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

有帮助吗?

解决方案

我找到了一种临时解决此问题的方法。

我所做的是将嵌入式文档加载到数组中,将要删除的文档拼接并更换数组。这样的事情:

var oldusers = dl.users;
oldusers.splice(dl.users.indexOf(req.currentUser.id), 1);
dl.users = oldusers;
dl.save(function(err) {...

我知道,取决于文档的大小

其他提示

我可能错了,因为我没有测试过您的示例,但这听起来像Mongoose并未检测到修改了嵌入式文档。

来自 模式类型文档页面:

由于它是无模式类型,因此您可以将价值更改为您喜欢的其他任何东西,但是 Mongoose失去了自动检测/保存这些更改的能力. 。 “告诉” mongoose,混合类型的价值已经改变, 调用.markModified(路径) 文档的方法将路径传递到您刚刚更改的混合类型。

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

因此,您的回答可能与使用MarkModified()函数一样简单。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top