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:{_id:ObjectId('5083e4a7f4c0c4e270000001'),名称:“Foo”}新:{_id:“5083e4a7f4c0c4e270000001”,名称:“Bar”,电子邮件:“foo@bar.baz” }

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

提前致谢!

4

2 回答 2

6

通过查看您的 mongo 错误,问题不在于 mongo,它只是在做它应该做的事情。它有一个 _id 为 ObjectId 类型的对象:ObjectId('xxx'),现在您尝试将该对象更改为具有 String 类型的 _id (_id: "5083e4a7f4c0c4e270000001"),而 Mongo 显然不喜欢。

所以,问题是:为什么对象首先有一个 ObjectId 类型的 id?第一次是怎么设置的?如果您使用其他方法来初始化它(我猜是服务器端),您应该将 id 类型设置为 String ,以便它与来自脚本库的相同。如果您希望它保留为 ObjectId,则需要将来自脚本的字符串转换为 ObjectId,然后再将其保存到 Mongo。

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

请参阅MongoDB 无法更新文档,因为 _id 是字符串,而不是 ObjectId

于 2013-12-02T16:52:40.660 回答