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('/')
});
})
});
したがって、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は、これらの変更を自動検出/保存する能力を失います. 。混合タイプの価値が変わったことを「伝える」ために、 .markModified(パス)を呼び出す 変更したばかりの混合タイプへのパスを通過するドキュメントの方法。
person.anything = { x: [3, 4, { y: "changed" }] };
person.markModified('anything');
person.save(); // anything will now get saved
したがって、回答は、MarkModified()関数を使用するのと同じくらい簡単かもしれません。