我有一种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,右操作数不能是属性
(强调我的)
答案 0 :(得分:1)
数据存储仅支持实体键上的HAS ANCESTOR
运算符(即特殊__key__
属性),而不支持常规键值。
可能的解决方法是明确将每个祖先作为属性包含在实体中。
例如,如果您的psets
属性包含密钥project:project1/foo:2/bar:3
,则可以维护一个单独的psets_ancestors
列表属性,其中包含project:project1
,project:project1/foo:2
,和project:project1/foo:2/bar:3
。然后,您可以在psets_ancestors
属性上执行相等查询:
SELECT * FROM client WHERE psets_ancestors = KEY(project, 'project1')
(这是以额外的索引条目为代价而必须维护单独的列表属性。)