16

私はMongoDBとBackboneの初心者なので、理解しようとしていますが、難しいです。私には大きな問題があります。必要なものだけをビューで使用するために Backbone.Model の属性を操作する方法がわかりません。より具体的に - 私はモデルを持っています:

window.User = Backbone.Model.extend({

    urlRoot:"/user",
    idAttribute: "_id",

    defaults: {
        _id: null,
        name: "",
        email: "foo@bar.baz"
    }
});

window.UserCollection = Backbone.Collection.extend({
    model: User,

    url: "user/:id"
});

そして、私はビューを持っています:

beforeSave: function(){
    var self = this;
    var check = this.model.validateAll();
    if (check.isValid === false) {
        utils.displayValidationErrors(check.messages);
        return false;
    }
    this.saveUser();
    return false;
},

saveUser: function(){
    var self = this;
    console.log('before save');
    this.model.save(null, {
        success: function(model){
            self.render();
            app.navigate('user/' + model.id, false);
            utils.showAlert('Success!', 'User saved successfully', 'alert-success');
        },
        error: function(){
            utils.showAlert('Error', 'An error occurred while trying to save this item', 'alert-error');
        }
    });
}

「_id」以外のフィールドからのデータを含む「put」メソッドを使用する必要があるため、次のようにする必要があります。

{"name": "Foo", "email": "foo@bar.baz"}

でも毎回、私が何をするかに依存しません。

{**"_id": "5083e4a7f4c0c4e270000001"**, "name": "Foo", "email": "foo@bar.baz"}

サーバーからのこのエラー:

MongoError: ドキュメントの _id を変更できません}

Github リンク: https://github.com/pruntoff/habo

前もって感謝します!

4

2 に答える 2

6

あなたのmongoエラーを見ると、問題はmongoにあるのではなく、本来のことをしているだけです。ObjectId タイプ ObjectId('xxx') の _id を持つオブジェクトがありましたが、そのオブジェクトを String タイプ (_id: "5083e4a7f4c0c4e270000001") の _id を持つように変更しようとしていますが、Mongo は明らかに気に入っていません。

問題は、そもそもなぜオブジェクトが ObjectId 型の ID を持っていたのかということです。最初はどのように設定しましたか?他の方法を使用して初期化した場合 (サーバー側だと思います)、id タイプを String に設定して、スクリプト ライブラリからのものと同じにする必要があります。ObjectId のままにしたい場合は、Mongo に保存する前に、スクリプトからの文字列を ObjectId に変換する必要があります。

HTH。

于 2012-10-23T21:11:19.910 に答える
6

MongoDBは_id を ObjectID として作成しますが、_id を ObjectID として取得しません。

この不一致が「正しい動作」であるかどうかにかかわらず、ほとんどの MongoDB ユーザーにとっては確かに厄介な驚きです。

次の方法で修正できます。

if ( this._id && ( typeof(this._id) === 'string' ) ) {
  log('Fixing id')
  this._id = mongodb.ObjectID.createFromHexString(this._id)
}

_id が ObjectId ではなく文字列であるため、MongoDB がドキュメントを更新できないを参照してください。

于 2013-12-02T16:52:40.660 に答える