Mongoose不会删除嵌入的文档

问题描述:

我在这里抓我的头像往常一样,它似乎与节点项目,我不知道如果我做错了什么或如果我遇到了一个错误。Mongoose不会删除嵌入的文档

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

这里是我的代码相对简单的例子:所以删除()实际上是除去服务

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('/') 
    }); 
    }) 
}); 

。如果我在保存前做了一个server.toObject(),它不在那里。任何想法,为什么它不会从数据库中删除它时保存?

编辑:我想版本号会有帮助。 [email protected][email protected] [email protected]

+0

我有同样的问题。 – Carlosedp 2011-03-19 16:54:20

我找到了一种方法来临时解决这个问题。

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

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

我知道,这取决于文件的大小它将

+0

这样做。谢谢! – mattmcmanus 2011-03-21 21:24:46

+0

这确实有用,但是有谁知道我们为什么必须将此作为解决方法? – 2014-07-16 15:09:09

我可能是错的,因为我没有测试你的榜样,但是这听起来像猫鼬没有检测嵌入文档被修改。

schema types documentation page

既然是无模式的类型,您可以将该值更改为任何你喜欢的,但猫鼬失去了自动检测/保存这些更改的能力。为了“告诉”Mongoose混合类型的值已更改,调用文档的.markModified(路径)方法将路径传递给您刚刚更改的混合类型。

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

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

+1

这将是完美的,除了markModified不适用于儿童。请参阅:https://github.com/LearnBoost/mongoose/issues/435 – k00k 2012-01-18 02:39:12

+0

在我的情况下工作。非常感谢你! – JMax 2012-06-01 18:25:42

+0

Carlosedp的解决方案仅适用于少数情况下的我。这似乎无处不在,似乎是更“正确”的方法。谢谢! – 2012-10-31 14:43:47