MongoError: не может изменить _id документа

Я новичок в MongoDB и Backbone, поэтому я пытаюсь понять их, но это сложно. У меня большая, большая проблема: я не могу понять, как манипулировать атрибутами в Backbone.Model, чтобы использовать в Views только то, что мне нужно. Более конкретно - у меня есть модель:

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

Мне нужно использовать "put" метод whit data из любых полей, кроме "_id", поэтому он должен быть smth вроде:

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

Но каждый раз, не зависит от того, что я делаю, отправляю

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

и эта ошибка с сервера:

MongoError: не может изменить _id старого документа: {_id: ObjectId ('5083e4a7f4c0c4e270000001'), имя: "Foo" } new: {_id: "5083e4a7f4c0c4e270000001", имя: "Бар", электронная почта: "[email protected]" }

Ссылка Github: https://github.com/pruntoff/habo

Спасибо заранее!

Ответы

Ответ 1

От взгляда на вашу ошибку монго, проблема не в монго, она просто делает то, что она должна делать. У него был объект с _id типа ObjectId: ObjectId ('xxx'), и теперь вы пытаетесь изменить этот объект на наличие _id типа String (_id: "5083e4a7f4c0c4e270000001" ) и что Mongo, по-видимому, не нравится.

Итак, возникает вопрос: почему у объекта был идентификатор типа ObjectId? Как вы установили его в первый раз? Если вы использовали какой-либо другой метод для его инициализации (я предполагаю, что на стороне сервера), вы должны установить тип id как String так, чтобы он был таким же, как тот, который поступает из вашей библиотеки script. Если вы хотите, чтобы он оставался ObjectId, вам нужно будет преобразовать строку, исходящую из вашего script, в ObjectId, прежде чем вы сохраните его в Mongo.

НТН.

Ответ 2

MongoDB создает _id как ObjectID, но не извлекает _id как ObjectID.

Является ли это несоответствие "правильным поведением" или нет, это, безусловно, вызывает раздражение у большинства пользователей MongoDB.

Вы можете исправить это с помощью

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

См. MongoDB не может обновить документ, потому что _id - это строка, а не ObjectId