2012-10-23 8 views
15

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

window.User = Backbone.Model.extend({ 

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

    defaults: { 
     _id: null, 
     name: "", 
     email: "[email protected]" 
    } 
}); 

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」以外の任意のフィールドから「置く」メソッドの聖霊降臨祭のデータを使用する必要があり、そう、それはのようになめらかである必要があります。

{"name": "Foo", "email": "[email protected]"} 

しかしたびに、私はそれが

を送って何をすべきかに依存しません
{**"_id": "5083e4a7f4c0c4e270000001"**, "name": "Foo", "email": "[email protected]"} 

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

MongoError: cannot change _id of a document old:{ _id: ObjectId('5083e4a7f4c0c4e270000001'), name: "Foo" } new:{ _id: "5083e4a7f4c0c4e270000001", name: "Bar", email: "[email protected]" }

Githubのリンク:事前にhttps://github.com/pruntoff/habo

ありがとう!

+0

を見る()' POSTが実行またはPUTされていますか? – InPursuit

+0

が実行されます。 'app.get( '/ user /:id'、usr.findById); app.put( '/ user /:id'、usr.updateUser); ' – Pruntoff

+0

' save'を呼び出すときにバックボーンがPUTを実行している場合、モデルのidAttribute(あなたのケースの_id)は送信されません。あなたのモデルで 'save()'の前に 'isNew()'を呼び出し、 'false'を返すことを確認できますか?また、 'save()'を呼び出す前に 'this.model.id'がnullでないか、または未定義であることを確認してください。 – InPursuit

答えて

6

あなたのモンゴーのエラーを見て、問題はモンゴーではありません、それはやっていることをやっているだけです。 ObjectId( 'xxx')の_idを持つオブジェクトがありましたが、そのオブジェクトをString型(_id: "5083e4a7f4c0c4e270000001")の_idに変更しようとしています。

問題は次のとおりです。最初にObjectId型のIDを持つのはなぜですか?どのようにして初めて設定しましたか?他のメソッドを使用して初期化した場合(私はサーバ側を推測しています)、id型を文字列に設定してスクリプトライブラリから来るものと同じにする必要があります。 ObjectIdのままにしたい場合は、Mongoに保存する前に、スクリプトから来るStringをObjectIdに変換する必要があります。

HTH。

+0

お返事ありがとうございます! この問題がありますが、MongoDBにも問題があります。もしわかっていれば、mongo docsはこう言います。* _idフィールドは不変です。更新時にその値を変更しようとすると、getLastError。*の「Mod on _id not allowed」エラーが発生します。*したがって、モデル内で_id attrを送信する必要はありませんが、モデルにはその必要があります。 JSONデータをモデル化すると、ObjectIdオブジェクトに文字列を変換する方法を教えてください。サーバーへのケースリクエストに_id文字列のJSONオブジェクトがあり、サーバー側で操作できません。 – Pruntoff

+0

私は更新をしているときにそのフィールドを送信することが大事だと思うが、変更したいオブジェクトを見つけるための識別子として考える。私はあなたが同じフォーマット(ObjectId)でIDを送信した場合、Mongoは(変更されていないので)それに対処しないという気持ちがあります。どの言語を使用しているのかわからないのでStringからObjectIdへの変換方法はわかりませんが、依然として質問は残っています。まずObjectIdをどうやって取得したのですか?元のオブジェクトはどこから来たのですか? – TheZuck

+0

私は問題を抱えています。 質問に答える:私はいくつかのJSONデータを挿入すると、ObjectIdが自動的にmongoDbによって自動的に取得されます。 問題を解決するには、mongooseをmongoDBで使用する必要はありません。代わりに、私は '.Types.ObjectId;'を使用します。 mongoドライバに間違いがない場合、ObjectIdデータにデータを変換するメソッドはありません。あなたの助けをたくさんありがとう! – Pruntoff

5

MongoDBのは、オブジェクトIDとして _idを作成しますが、は、オブジェクトIDとして _idを取得しません。

この矛盾が「正しい動作」であってもなくても、ほとんどのMongoDBユーザーにとって確かに迷惑な驚きです。

あなたがして、それを修正することができます:あなたは `model.saveを呼び出すと

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

MongoDB can't update document because _id is string, not ObjectId

+1

また、 'var BSON = mongodb.BSONPure'を定義し、この関数を使用することもできます:' this._id = new BSON.ObjectID(this._id); ' –

関連する問題