限制数据查看器中的字段

Lum*_*mpy 1 google-app-engine gql

我试图在GAE的数据存储区查看器中做一些简单的报告.使用GQL我想只显示一个记录的几个字段.这可能吗?

如何使用字段实体:

f1 f2 f3 f4 f5 f6

并显示

f1 f3 f5 f6

Ibr*_*ief 5

这是不可能的.从GQL参考文档:

每个GQL查询始终以SELECT *或开头SELECT __key__.

从数据存储区概述的SQL差异部分:

查询数据存储区时,目前无法仅返回类型属性的子集.App Engine数据存储区可以从查询中返回整个实体或仅返回实体键.


至于存在这种限制的原因,关于如何存储实体和索引的文章对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目前不支持它的原因.