2012-10-23 37 views
15

Tôi là người mới đến MongoDB và Backbone, vì vậy tôi cố gắng hiểu chúng, nhưng rất khó. Tôi có một vấn đề lớn, lớn: Tôi không thể hiểu cách thao tác các thuộc tính trong Backbone.Model để sử dụng trong Views chỉ những gì tôi cần. Nhiều cụ thể - Tôi có một mô hình :MongoError: không thể thay đổi _id của tài liệu

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" 
}); 

Và tôi có một Xem:

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'); 
     } 
    }); 
} 

tôi phải sử dụng 'đặt' dữ liệu phương pháp whit từ bất kỳ lĩnh vực ngoại trừ '_id', do đó, nó phải là smth như:

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

Nhưng mỗi lần, không phụ thuộc vào những gì tôi làm nó gửi

{**"_id": "5083e4a7f4c0c4e270000001"**, "name": "Foo", "email": "[email protected]"} 

và lỗi này từ máy chủ:

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

Github liên kết: https://github.com/pruntoff/habo

Cảm ơn trước!

+0

Khi bạn gọi 'model.save() 'là một POST đang được thực hiện hoặc một PUT? – InPursuit

+0

nó là PUT thực hiện. 'app.get ('/ user /: id', usr.findById); app.put ('/ user /: id', usr.updateUser); ' – Pruntoff

+0

Nếu xương sống đang thực hiện PUT khi bạn gọi' save' thì idAttribute của mô hình (_id trong trường hợp của bạn) sẽ không được gửi đi. Bạn có thể gọi 'isNew()' trên mô hình của bạn trước khi 'save()' và xác minh rằng nó trả về 'false'? Đồng thời xác minh rằng 'this.model.id' không phải là null hoặc undefined trước khi gọi' save() ' – InPursuit

Trả lời

6

Từ khi nhìn vào lỗi mongo của bạn, vấn đề không phải là với mongo, nó chỉ là làm những gì nó phải làm. Nó có một đối tượng với _id của ObjectId type: ObjectId ('xxx') và bây giờ bạn đang cố gắng thay đổi đối tượng đó để có một _id của một kiểu String (_id: "5083e4a7f4c0c4e270000001") và Mongo dường như không thích.

Vì vậy, câu hỏi đặt ra là: tại sao đối tượng có id của loại ObjectId ngay từ đầu? Bạn đã đặt nó lần đầu tiên như thế nào? Nếu bạn sử dụng một số phương pháp khác để khởi tạo nó (tôi đoán phía máy chủ), bạn nên đặt kiểu id là một String để nó giống như một cái đến từ thư viện kịch bản lệnh của bạn. Nếu bạn muốn nó ở lại một ObjectId, bạn sẽ cần phải chuyển đổi String đến từ kịch bản của bạn thành một ObjectId trước khi bạn lưu nó vào Mongo.

HTH.

+0

Cảm ơn rất nhiều câu trả lời của bạn! Tôi thấy rằng vấn đề, nhưng có một vấn đề trong MongoDB quá, nếu tôi hiểu đúng, tài liệu mongo nói: * Trường _id là không thay đổi.Nếu bạn cố gắng thay đổi giá trị của nó trên một bản cập nhật, bạn sẽ nhận được một lỗi "Mod on _id not allowed" từ getLastError. * Vì vậy, tôi nghĩ rằng tôi phải loại bỏ gửi _id attr trong mô hình, nhưng mô hình cần phải có nó. Tóm lại, bạn có thể cho tôi biết, làm thế nào để chuyển đổi chuỗi thành đối tượng ObjectId, khi tôi tìm dữ liệu JSON trong mô hình? trường hợp yêu cầu đến máy chủ có đối tượng JSON với chuỗi _id và tôi không thể thao tác nó trên phía máy chủ. – Pruntoff

+0

Tôi nghĩ rằng đó là ok để gửi lĩnh vực đó khi thực hiện một bản cập nhật nhưng là một định danh để tìm đối tượng bạn muốn thay đổi. Tôi có cảm giác rằng nếu bạn gửi id trong cùng một định dạng (ObjectId) Mongo sẽ không phản đối (vì nó không bị thay đổi). Tôi không biết làm thế nào để chuyển đổi từ String sang ObjectId như tôi không biết ngôn ngữ bạn đang sử dụng, nhưng vẫn còn câu hỏi vẫn còn: làm thế nào nó có được một ObjectId ở nơi đầu tiên? đối tượng ban đầu đến từ đâu? – TheZuck

+0

Tôi gặp vấn đề, bạn đã đúng, đó là tất cả về việc hình thành. Trả lời các câu hỏi của bạn: ObjectId được tự động ở vị trí đầu tiên bởi mongoDb khi tôi chèn một số dữ liệu JSON. Để giải quyết vấn đề tôi không cần sử dụng mongoDB với mongoose thay vì chỉ trình điều khiển mondoDB tôi sử dụng '.Types.ObjectId;'. Nếu tôi không nhầm lẫn trình điều khiển mongo không có phương pháp để chuyển đổi dữ liệu sang dữ liệu ObjectId. :(Cảm ơn rất nhiều sự giúp đỡ của bạn! – Pruntoff

5

MongoDB tạo _id như một ObjectID, nhưng không truy xuất _id như một ObjectID.

Cho dù sự không nhất quán này là 'hành vi chính xác' hay không, nó chắc chắn là một bất ngờ gây phiền nhiễu cho hầu hết người dùng MongoDB.

Bạn có thể sửa chữa nó với:

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

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

+1

Hoặc, bạn có thể định nghĩa 'var BSON = mongodb.BSONPure' và sử dụng hàm này:' this._id = new BSON.ObjectID (this._id); ' –

Các vấn đề liên quan