MongoError,不能改变_id的文件(MongoError: cannot change _i

2019-07-02 08:56发布

我是新手,MongoDB的骨干,所以我试着去了解他们,但做起来很难。 我有一个很大很大的问题:我不明白如何操作在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”任何领域使用“放”方法白衣的数据,所以它必须是水木清华这样的:

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

但每一次,不取决于我做什么它发送

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

从服务器这个错误:

MongoError:不能改变旧文档的_id:{_id:物件( '5083e4a7f4c0c4e270000001'),名称: “富”}新:{_id: “5083e4a7f4c0c4e270000001”,名称: “酒吧”,邮件: “foo@bar.baz” }

Github上链接: https://github.com/pruntoff/habo

提前致谢!

Answer 1:

从看你蒙戈错误,问题不在于蒙戈,它只是在做它应该做的。 它曾与的ObjectId类型的_id对象:物件(“XXX”),现在你要改变的对象有一个String类型的_id(_id:“5083e4a7f4c0c4e270000001”)和蒙戈显然不喜欢。

所以,问题是:为什么对象有型的ObjectId的摆在首位的ID? 你是如何设置它的第一次? 如果你使用其他一些方法来初始化它(我猜服务器端),你应该设置ID类型为字符串,使其等同于一个从你的脚本库的到来。 如果你希望它留一个的ObjectId,你需要将它保存到蒙戈之前,从您的脚本来的字符串转换为的ObjectId。

HTH。



Answer 2:

MongoDB的创建 _id作为对象ID,但不检索 _id作为对象ID。

无论这种不一致是“正确的行为”与否,可以肯定的是大多数用户的MongoDB一个恼人的惊喜。

你可以解决它:

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

见,因为_id是字符串,而不是MongoDB的无法更新文档的ObjectId



文章来源: MongoError: cannot change _id of a document