【问题标题】:Is it possible to run an ' HAS ANCESTOR' filter/query on a property that contains a list(Value) of keys是否可以对包含键列表(值)的属性运行“有祖先”过滤器/查询
【发布时间】:2015-10-06 07:56:18
【问题描述】:

我有一种client,它由具有属性psets 的实体组成,其中包含Key 的列表

使用 JSON api psets 这将表示为:

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

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

我正在尝试使用在“客户端”上运行“祖先”查询

SELECT * from client where psets HAS ANCESTOR KEY( project, 'project1')

此查询返回错误:unsupported property

什么是不支持的?

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

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

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

(强调我的)

【问题讨论】:

  • 这看起来像一个文档错误。我正在努力解决这个问题,希望能提供更好的错误消息。

标签: google-cloud-datastore


【解决方案1】:

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

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

例如,如果您的psets 属性包含一个键project:project1/foo:2/bar:3,您可以维护一个单独的psets_ancestors 列表属性,其中包含project:project1project:project1/foo:2project:project1/foo:2/bar:3。然后你可以对 psets_ancestors 属性进行相等查询:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    相关资源
    最近更新 更多