質問

私はここで頭をかき回しています。いつものようにノードプロジェクトのように見えます。何か間違ったことをしているのか、バグに遭遇したのかはわかりません。

サービスと呼ばれる数の埋め込みドキュメントを持つことができるサーバーのスキーマがあります。私は問題に遭遇しますが、そこでは、サーバーオブジェクトから個々のサービスを正常に削除したにもかかわらず、保存するように指示するとデータベースから削除されません。保存機能は、私が行った変更を保存しており、新しい埋め込みドキュメントをプッシュしているため、機能しているため、すでにそこにあるドキュメントを削除していません。

これが私のコードの比較的単純化された例です。

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()関数を使用するのと同じくらい簡単かもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top