【问题标题】:Datastore: composite index not recognised数据存储:无法识别复合索引
【发布时间】:2016-12-06 13:23:28
【问题描述】:

我编写了一段代码,该代码基于一个过滤器(以及同一属性的顺序)从数据存储中添加和检索实体 - 效果很好。但是当我尝试为更多属性添加过滤器时,我得到了:

PreconditionFailed: 412 没有找到匹配的索引。推荐的索引是:
- 种类:温度
属性:
- 名称:DeviceID
- 名称:创建

最终我发现我需要创建 index.yaml。我的看起来像这样:

indexes:
- kind: Temperature
  ancestor: no
  properties:
  - name: ID
  - name: created
  - name: Value

它似乎已被识别,如控制台所示: that it has been updated 然而,当我运行我的代码(特别是这部分具有两个属性)时,它不起作用(仍然出现上述错误)(代码在 Compute Engine 上运行)。

query.add_filter('created', '>=', newStart)
query.add_filter('created', '<', newEnd)
query.add_filter('DeviceID', '=', devID)
query.order = ['created']

尝试在控制台上运行相同的查询会产生

您的数据存储区没有此查询所需的复合索引(开发人员提供)。

error. 搜索显示了另一个遇到同样问题的人,他设法通过更改 index.yaml 中属性的顺序来解决它,但这对我的情况没有帮助。有没有人遇到过类似的问题或者可以帮我解决一下?

【问题讨论】:

    标签: python-2.7 google-compute-engine google-cloud-datastore


    【解决方案1】:

    您需要创建错误消息中建议的确切索引:

    - kind: Temperature
      ancestor: no
      properties:
      - name: DeviceID
      - name: created
    

    具体来说,索引中的第一个属性必须是 DeviceID 而不是 ID,并且索引中的最后一个属性必须是您在不等式过滤器中使用的那个(所以您不能有 @ 987654324@ 作为索引中的最后一个属性)。

    【讨论】:

    • 嗯...我想我更加困惑这些复合索引是如何工作的。您的解决方案运行良好,但我想知道,为什么我必须从 index.yaml 中排除“值”?是因为只有用于排序/排序的属性必须存在吗?
    • 这是索引如何工作的实现细节。它们是“稀疏的”,因此没有 Value 属性的实体不会出现在您的索引中,并且查询可能会错误地省略某些结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2018-08-22
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多