如何使Backbone和MongoDB的id无缝工作?

jul*_*n_c 12 php mongodb backbone.js

我的Backbone应用程序正在与构建在MongoDB之上的REST API进行通信,因此我的对象的"自然"ID确实如此MongoIDs.当序列化为JSON时,它们看起来像:

"_id":{"$id":"505099e998dee4db11000001"}
Run Code Online (Sandbox Code Playgroud)

骨干文件中提到,您可以用比指定另一个名称id为(使用骨干模型的id属性idAttribute),然而,作为MongoIDs'字符串表示嵌套,只是用idAttribute: '_id'在直接消费JSON没有帮助.

除了重写服务器端的属性之外,有没有办法解决这个问题?

更新:

这是我在服务器端做的事情:

$m = new Mongo();
$posts = $m->mydatabase->posts->find();

$out = array();

foreach ($posts as $post) {
    $out[] = $post;
}

echo json_encode($out);
Run Code Online (Sandbox Code Playgroud)

我知道我可以做类似的事情,$post['id'] = (string) $post['_id']; unset($post['_id']);但这正是我想要避免的事情!

jmk*_*142 16

这听起来像是一个很好的例子parse().

由于您的Mongo JSON最终发送:

"_id":{"$id":"505099e998dee4db11000001"}
Run Code Online (Sandbox Code Playgroud)

为什么不使用Backbone解析来正确命名传入数据?

parse: function(response) {
    response.id = response._id['$id'];
    delete response._id;

    return response;
}
Run Code Online (Sandbox Code Playgroud)

或类似的东西.同样,由于Backbone将使用'id'将ID作为JSON发送,因此您的服务器可能会采用该方法并以另一种方式"翻译"它.

如果你想使用一个不同的id属性,_id你就只需更换与此代码上面的解析:

idAttribute: '_id',

parse: function(response) {
    response._id = response._id['$id'];

    return response;
}
Run Code Online (Sandbox Code Playgroud)

什么都适合你.:-)


小智 5

最好在浏览器中进行转换,以便从服务器上移除计算.所以你想要创建一个基本MongoModel,然后你可以从MongoModel而不是Backbone.Model扩展.

MongoModel = Backbone.Model.extend({
    // this handle conversion between the mongo's _id and backbone id
    // this is best done on the client side to alleviate server load
    //_id : { "$oid" : ... } <--> id
    parse : function (response) {
        response.id = response._id.$oid;
        delete response._id;
        return response;
    },
    toJSON : function () {
        var
            json = Backbone.Model.prototype.toJSON.apply(this);
        json._id = {'$oid':json.id};
        delete json.id;
        return json;
    }
});
Run Code Online (Sandbox Code Playgroud)