是否可以在包含键列表(Value)的属性上运行“HAS ANCESTOR”过滤器/查询

时间:2015-10-06 07:56:18

标签: google-cloud-datastore

我有一种client由包含psets

列表的属性Key的实体组成

使用JSON api psets这表示为:

psets = { listValue: [ {keyValue: { path: [...]} },{keyValue: { path: [...]} },... ]}

KeyValues由path = [{ kind: 'project', name: 'projectn' }]

组成

我正在尝试使用

在'client'上运行'祖先'查询
SELECT * from client where psets HAS ANCESTOR KEY( project, 'project1')

此查询返回错误:unsupported property

什么是不受支持的?

如何在按键列表上运行“HAS ANCESTOR”过滤器?

请注意,根据DataStore Documentation(运算符和比较)

  

条件还可以使用HAS ANCESTOR或HAS DESCENDANT运算符测试一个实体是否具有另一个实体作为祖先。这些运算符测试密钥之间的祖先关系。它们可以在__key__上运行,但它们也可以在键值属性上运行。对于HAS ANCESTOR,右操作数不能是属性

(强调我的)

1 个答案:

答案 0 :(得分:1)

数据存储仅支持实体键上的HAS ANCESTOR运算符(即特殊__key__属性),而不支持常规键值。

可能的解决方法是明确将每个祖先作为属性包含在实体中。

例如,如果您的psets属性包含密钥project:project1/foo:2/bar:3,则可以维护一个单独的psets_ancestors列表属性,其中包含project:project1project:project1/foo:2,和project:project1/foo:2/bar:3。然后,您可以在psets_ancestors属性上执行相等查询:

SELECT * FROM client WHERE psets_ancestors = KEY(project, 'project1')

(这是以额外的索引条目为代价而必须维护单独的列表属性。)