NDB查询与投影在()中.IN使用的属性
比方说,我有一个模型:NDB查询与投影在()中.IN使用的属性
class Pet(ndb.Model):
age = ndb.IntegerProperty(indexed=False)
name = ndb.StringProperty(indexed=True)
owner = ndb.KeyProperty(indexed=True)
而且我有一个名为owners
键的列表。要为Pet
就做一个查询,我会做:
pets = Pets.query(Pets.owner.IN(owners)).fetch()
的问题是,该查询返回整个实体。
我该如何做一个预计的查询并获取所有者和名称?
或者我应该如何构造数据来获取名称和所有者。
我可以做一个name
的预测,但我松了从宠物的所有者的参考。 owner
不能在投影中。
正如你已经注意到了,你不能做到这一点与你提到的具体情况下,因为你打Limitations on projections之一:
- 属性在平等引用(=)或会员( IN)滤波器无法投射。
由于owner
在IN
滤波器它不能投影被使用。既然你需要owner
,你不能投影它,你将不得不放弃投影,因此你将永远得到整个实体。
一种选择将是你的实体总是分裂成2个等实体,变成了1:1的关系,使用相同的实体ID:
class PetA(ndb.Model):
name = ndb.StringProperty(indexed=True)
owner = ndb.KeyProperty(indexed=True)
class PetB(ndb.Model):
age = ndb.IntegerProperty(indexed=False)
这样你就可以做同样的查询,除了在PetA
而不是原来的Pet
,结果你会得到相当于你正在寻找的原始投影查询。
不幸的是,这只适用于同一个实体的一个或几个这样的投影查询,否则你需要将实体拆分成太多块。所以你可能不得不妥协。
您可以找到有关实体的分裂更细节re-using an entity's ID for other entities of different kinds - sane idea?
嗯,有趣的想法。谢谢。但是如果宠物只包含我需要的数据,你会说只索引“所有者”是一个好主意?这个名字没有必要,对吗?没有查询名称 –
仅当您想要按“name”过滤或排序查询结果时,才需要索引'name'。 –
它总是由设计 – voscausa
返回整个实体(对象)请澄清你的问题对我来说,因为如果你有keys.You的名单可以调用' (key).get()'并且它将带出你将选择你想要的propery的'entity'。同时通过密钥获取实体在应用引擎中是免费的! – Xenolion