mat*_*nus 7 mongoose mongodb node.js express
我在这里摸不着头脑,就像通常的节点项目一样,我不确定我做错了什么或者我是否遇到了一个bug.
我有一个Server模式,可以有任意数量的嵌入式文档称为服务.我遇到了一个问题虽然在哪里,即使我已经成功地从服务器对象中删除了单个服务,当我告诉它保存它时不会将其从数据库中删除.保存功能正在运行,因为它保存了我所做的任何更改,并且还推动了新的嵌入式文档,它只是没有删除已存在的那些.
这是我的代码的一个相对简化的示例:
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('/')
});
})
});
Run Code Online (Sandbox Code Playgroud)
所以remove()实际上是删除了服务.如果我在保存之前执行了server.toObject(),那就不存在了.任何想法为什么它保存时不会从数据库中删除它?
编辑:我想版本号会有所帮助.node@0.4.2,mongoose@1.1.5 express@2.0.0rc
我可能是错的,因为我尚未测试您的示例,但这听起来像Mongoose并未检测到嵌入式文档已被修改。
从模式类型文档页面:
由于它是一种无模式类型,因此您可以将其值更改为其他任何值,但是Mongoose失去了自动检测/保存这些更改的功能。要“告诉”猫鼬混合类型的值已更改,请调用文档的.markModified(path)方法,将路径传递给刚更改的混合类型。
person.anything = { x: [3, 4, { y: "changed" }] };
person.markModified('anything');
person.save(); // anything will now get saved
Run Code Online (Sandbox Code Playgroud)
因此,您的答案可能和使用markModified()函数一样简单。
我找到了暂时解决这个问题的方法。
我所做的是将嵌入的文档加载到一个数组中,拼接要删除的文档并替换该数组。像这样的东西:
var oldusers = dl.users;
oldusers.splice(dl.users.indexOf(req.currentUser.id), 1);
dl.users = oldusers;
dl.save(function(err) {...
Run Code Online (Sandbox Code Playgroud)
我知道根据文档的大小,它会
| 归档时间: |
|
| 查看次数: |
2847 次 |
| 最近记录: |