我正在尝试在GAE的数据存储区查看器中进行一些简单的报告。使用GQL我想只显示一个记录的几个字段。这可能吗?
如何使用字段获取实体:
f1 f2 f3 f4 f5 f6
并显示
f1 f3 f5 f6
答案 0 :(得分:5)
这是不可能的。来自the GQL Reference documentation:
每个GQL查询始终以
SELECT *
或SELECT __key__
开头。
来自数据存储区概述的Differences with SQL section:
查询数据存储区时,目前无法返回 只是种类属性的子集。 App Engine数据存储区可以 从查询中返回整个实体或仅返回实体键。
至于为何存在这种限制,关于How Entities and Indexes are Stored的文章对Google的Bigtable(分布式数据库系统为App Engine的数据存储提供支持)背后的技术方面提供了很好的见解。 (和其他谷歌产品)
从文章中,数据存储区实体存储在几个不同的Bigtables中。 Entity Bigtable
存储实体的整个属性,并且几个Index Bigtables
存储根据实体的索引排序的实体密钥。
当我们执行查询时,基本上会发生两个步骤。第一步是我们正在针对Index Bigtables
执行查询,生成一组与我们的查询匹配的实体键。第二步是使用密钥集从Entity Bigtable
获取整个实体。
因此,当您从SELECT __key__
开始执行查询时,数据存储区只需要执行第一步并立即使用该组键返回。当您从SELECT *
开始执行查询时,数据存储区会执行这两个步骤并返回实体集。
现在,关于为什么数据存储不支持SELECT f1, f3, f5, f6
之类的查询,我们需要进一步详细了解上述第二步中发生的事情。从文章中可以看出Entity Bigtable
:
不是将每个实体属性存储为相应Bigtable行中的单个列,而是使用单个列,其中包含二进制编码的协议缓冲区,其中包含给定实体的每个属性的名称和值。
由于低级协议缓冲区将整个实体的属性存储为单个序列化数据,这意味着仅查询实体属性的一个子集实际上需要额外的后处理步骤来过滤结果设置并仅获取查询的属性。这将导致数据存储区性能下降,这可能是Google目前不支持它的原因。