要するに、コレクションを取得していますが、その後、コレクションから特定のエンティティを取得できませid
んcid
。
この問題については、私の 2 つの REST エンドポイント/sites
と/sites/some-site-id/entities
両方がコレクションであるsites
と考えてください。entities
ここに私のモデル/コレクションがあります:
モデル/コレクション
var ROOT = 'http://localhost:5000';
Entity = Backbone.Model.extend({
idAttribute: "_id",
defaults: {
xpos: 10,
ypos: 10,
site: "default"
}
});
Entities = Backbone.Collection.extend({
model: Entity,
ownUrl: '/entities',
site: {},
url: function() {
return ROOT + "/sites/" + (this.site? this.site : 'null') + this.ownUrl;
},
initialize: function(models, options) {
if(!options.site) throw new Error("No site associated with entities");
if(!options.site.get("_id")) throw new Error("Associated site has no _id");
this.site = options.site.get("_id");
}
});
Site = Backbone.Model.extend({
idAttribute: "_id",
defaults: {
name: "default",
description: "My site"
}
});
Sites = Backbone.Collection.extend({
model: Site,
url: ROOT + "/sites"
});
私の問題は、サイトのエンティティをフェッチしているときに、コレクションのget
メソッドを使用してコレクションから特定のエンティティを検索できないことです。私は単にundefined
返されます。
これは私がそれをテストする方法です(entities.fetchは4つのエンティティを取得します):
テストコード
var site1 = new Site({id : "52813a2888c84c9953000001"});
sites.add(site1);
site1.fetch({success: function(model, response, options) {
entities = new Entities([], {site: site1});
entities.fetch({success: function(model, response, options) {
entities.each(function (entity) {
console.log("entity.get(\"_id\") = " + entity.get("_id"));
console.log("entity.id = " + entity.id);
console.log("Looking up entity using id (" + entity.get("_id") + "): " + entities.get(entity.get("_id")));
console.log("Looking up entity using cid (" + entity.cid + "): " + entities.get(entity.cid));
console.log("");
});
}});
}});
これを実行すると、次のようになります。
テスト結果
entity.id = undefined
entity.get("_id") = 528146ade34176b255000003
Looking up entity using id (528146ade34176b255000003): undefined
Looking up entity using cid (c1): undefined
entity.id = undefined
entity.get("_id") = 528146ade34176b255000002
Looking up entity using id (528146ade34176b255000002): undefined
Looking up entity using cid (c2): undefined
entity.id = undefined
entity.get("_id") = 528146ade34176b255000001
Looking up entity using id (528146ade34176b255000001): undefined
Looking up entity using cid (c3): undefined
entity.id = undefined
entity.get("_id") = 528146ade34176b255000004
Looking up entity using id (528146ade34176b255000004): undefined
Looking up entity using cid (c4): undefined
私が期待するのは、コレクションが特定のエンティティを返すことです。私の特別なidAttribute "_id"(mongodbに準拠するため)と関係がありますか?
編集
どうやら私のidAttributeと関係があるようです。返されるすべてのエンティティに「id」フィールドを追加すると、その ID を使用してエンティティを検索できるためです。サーバー側のように:
function getEntitiesInSite(siteId, fun) {
db.siteentities.find({site: mongojs.ObjectId(siteId)}, function(err, entities) {
entities.forEach(function (entity) {
entity.id = entity._id;
});
fun(err, entities);
});
}
これはまさに私が望んでいたものではなく、将来、一貫性のない ID (id
と_id
フィールドの両方を持つ) で他の問題に遭遇することが想像できます。