7

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

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

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

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

4

2 に答える 2

5

あなたの例をテストしていないので、間違っている可能性がありますが、埋め込まれたドキュメントが変更されたことをMongooseが検出していないようです。

スキーマタイプのドキュメントページから:

これはスキーマのない型であるため、値を任意の値に変更できますが、Mongoose はそれらの変更を自動検出/保存する機能を失います。Mixed 型の値が変更されたことを Mongoose に「伝える」には、変更したばかりの Mixed 型へのパスを渡すドキュメントの .markModified(path) メソッドを呼び出します。

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

したがって、あなたの答えは、markModified() 関数を使用するのと同じくらい簡単かもしれません。

于 2011-10-24T23:00:34.323 に答える
3

この問題を一時的に修正する方法を見つけました。

私がしたことは、埋め込まれたドキュメントを配列にロードし、削除するドキュメントをスプライスして、配列を置き換えることです。このようなもの:

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

ドキュメントのサイズによっては、

于 2011-03-19T17:17:38.560 に答える