mongoose不会删除embedded的文件

我在这里像往常一样抓着我的脑袋,似乎与节点项目,我不知道如果我做错了什么,或者如果我遇到了一个错误。

我有一个服务器架构可以有任何数量的embedded式文档称为服务。 尽pipe我已经成功地从服务器对象中删除了个别服务,但是在我告诉它保存的时候,我却遇到了一个问题,即不能从数据库中删除它。 保存function正在工作,因为它保存了我所做的任何更改,并且正在推进新的embedded式文档,它只是不删除已经存在的文档。

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

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

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

我所做的是将embedded式文档加载到数组中,拼接要删除的文件并replace数组。 像这样的东西:

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

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

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

从架构types文档页面 :

由于它是一个无模式的types,你可以改变你喜欢的任何东西的值,但是Mongoose失去了自动检测/保存这些变化的能力 。 为了“告诉”Mongoose混合types的值已经改变, 调用文档的.markModified(path)方法,将path传递给你刚才改变的混合types。

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

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