2014-07-21 82 views
0

我使用appengine和objectify作为我的应用程序的后端。当我在数据存储中查询时,我得到一个Entity对象,它具有所需行的数据。但是,使用物化我将如何查询实体并从中获得选定的文件?因为查询整个实体将会很繁重,并且需要更多的数据带宽。例如:在具有4列的实体中, - > Id,名称,描述,年龄。我应该询问oly Id,姓名,年龄。我不想要描述被查询。在实体中查询实体中的选定字段 - appengine

+0

这看起来像是http://stackoverflow.com/questions/11775317/objectify-query-a-attribute-from-an-entity的副本。另外,重型数据存储概念与rdbms不一样。了解有关数据存储查询成本的更多信息。 – kctang

回答

1

如果您正在寻找投影查询,它们还没有在Objectify中实现。

https://groups.google.com/forum/#!topic/objectify-appengine/uvLIHhHMEM0

+0

请描述更详细的答案,而不是链接到另一个讨论站点。或者,在问题上使用评论功能。 –

+2

不知道为什么@jewirth低估了这一点,答案是现货。 – koma

+0

我误解了答案。感谢您指出@koma。 –

3

的GAE数据存储不工作像一个RDBMS;你不能随意选择和选择从实体中查询哪些字段。数据存储查询的标准行为是遵循一个索引(将属性值映射到实体键),然后通过键来获取所有找到的实体。

有一种称为“投影查询”(Objectify支持的功能;查询命令对象上的project()方法),但它不是像SQL中获得的通用SELECT语句。投影查询利用了索引本身包含索引值的事实,因此如果您只需要索引中的数据,则不需要执行整个实体的后续提取。但是,这带有一些限制:

  • 您必须维护一个包含所有希望投影的数据的多属性索引。
  • 您必须为多属性索引中的每个字段维护单一属性索引。
  • 您只能在遵循该特定索引的查询上进行投影。
  • 查询绕过Objectify的基于内存缓存的实体缓存。

请注意使用投影查询的成本。在您的示例中,您将需要Name和Age上的单一属性索引以及{__key__, Name, Age}上的多属性索引。每个实体写入3个写入操作,而新的实体将花费8个写入操作。另一方面,投影查询的成本是一个常量1读操作。

其他另一方面,从memcache获取的批量成本为0,最坏的成本为1读操作。除非您的描述字段已知会导致您的问题,否则这是一个大规模的过早优化。