12

私のバックボーン アプリは、MongoDB の上に構築された REST API と通信しているため、オブジェクトの「自然な」ID は実際にはMongoIDs. JSON にシリアル化すると、次のようになります。

"_id":{"$id":"505099e998dee4db11000001"}

バックボーンのドキュメントidには、バックボーン モデルの id 属性以外の名前を ( を使用して) 指定できると記載されていますがidAttribute、MongoID の文字列表現はネストされているため、使用するだけidAttribute: '_id'では JSON を直接使用することはできません。

サーバー側で属性を書き換える以外に、これを回避する方法はありますか?

アップデート:

これが私がサーバー側でやっていることです:

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

$out = array();

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

echo json_encode($out);

私は何かをすることができることを知っています$post['id'] = (string) $post['_id']; unset($post['_id']);が、それはまさに私が避けたいことです!

4

5 に答える 5

15

これは の良い例のように思えparse()ます。

あなたのMongo JSONは最終的に送信するので:

"_id":{"$id":"505099e998dee4db11000001"}

バックボーン解析を使用して、受信データを適切に名前空間化しないのはなぜですか?

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

    return response;
}

または、このようなもの。同様に、Backbone は ID を「id」付きの JSON として送信するため、サーバーはそれを受け取り、別の方法で「変換」する可能性があります。

別のid 属性を使用する場合_idは、上記の解析を次のコードに置き換えるだけです。

idAttribute: '_id',

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

    return response;
}

あなたに最適なものは何でも。:-)

于 2012-09-12T15:02:31.380 に答える
5

サーバーから計算を移動するように、ブラウザで変換を行う方がよいでしょう。したがって、基本の MongoModel を作成したいと思うでしょう。そして、Backbone.Model の代わりに MongoModel から拡張できます。

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;
    }
});
于 2013-10-02T22:34:32.910 に答える
3

さまざまな提案されたオプションを見て、私が最も簡単だと思ったのは、避けたいことをすることです。(ただし、解析の使用は機能します)

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

$out = array();

foreach ($posts as $post) {
    // populate an id field
    $post['id']=$post['_id']->{'$id'},
    $out[] = $post;
}

echo json_encode($out);

$post['_id']同期時にモデルからモデルを送り返す場合は保持します。より多くのクライアントがAPIに接続したいと思うかもしれないので、私はAPIを修正することを好みます。

于 2013-02-01T12:56:51.063 に答える
0

Ruby では、次のことができます。

items.find.to_a.map do |アイテム|
  frombsonid(アイテム)
end.to_json

def frombsonid(obj) obj.merge({'_id' => obj['_id'].to_s}) 終わり

データを取得したら、文字列を BSON::ObjectId に変換できます。

def tobsonid(id) BSON::ObjectId.fromstring(id) end

したがって、各項目の _id を文字列バージョンの BSON::ObjectId に置き換えるという考え方です。

バックボーンで追加できます

idAttribute: "_id", 

PHP では、さまざまな構文とメソッドを使用しますが、これを再現することは十分に可能だと思います。

于 2013-01-08T16:16:23.180 に答える
0

PHP コードは、Backbone がやり取りする REST API であるため、Mongo の複雑なプロパティを、探している単純な文字列に抽象化する必要があります。それは間違いなく API の仕事です。_idid

バックボーン、または API の他のコンシューマーは、Mongo または_id.

なんで?Mongo から が存在しない他の Db に切り替えたとしても、これまでに公開されたのはすべて であり、これは非常に汎用的である_idため、API は引き続き良好です。idしたがって、あなたのオリジナルのアイデアは実際には最高のアイデアでした (ただし、そのコードの一部を、投稿だけでなくすべてのモデルで再利用できるものに抽象化する必要があります)。

于 2015-01-14T07:45:21.187 に答える