所需的复合索引不存在,但已在index.yaml中定义

时间:2018-09-18 07:06:00

标签: google-cloud-platform google-cloud-datastore

我有一些IoT设备正在将一些数据发送到Google Cloud Datastore。

数据存储已在数据存储模式下设置为Cloud Firestore。

每行具有以下字段:

  • 名称/ ID
  • 当前温度
  • 数据
  • device_id
  • 事件
  • gc_pub_sub_id
  • published_at
  • target_temperature

这些都是ParticleEvent类型。

我希望运行以下查询; select current_temperature, target_temperature from ParticleEvent where device_id = ‘abc123’ order by published_at desc

当我尝试运行该查询时出现以下错误:

  

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

因此,我设置了一个包含以下内容的index.yaml文件:

indexes:

- kind: ParticleEvent
  properties:
  - name: data
  - name: device_id
  - name: published_at
    direction: desc

- kind: ParticleEvent
  properties:
  - name: current_temperature
  - name: target_temperature
  - name: device_id
  - name: published_at
    direction: desc

我使用了gcloud工具将其成功发送到数据存储区,并且可以在“索引”标签中看到两个索引。

但是,当我尝试运行查询时,仍然出现上述错误。

我需要添加/更改索引以使此查询正常工作吗?

1 个答案:

答案 0 :(得分:2)

尽管在评论中我只是建议select *(我认为这是最好的方法)

有一种方法可以使您的查询正常工作。

- kind: ParticleEvent
  properties:
  - name: device_id
  - name: published_at
    direction: desc
  - name: current_temperature
  - name: target_temperature

之所以select结束,是因为您需要较低级别的current_temperaturetarget_temperature索引。


为什么我不建议这种方式是因为,当您的数据增长并且您需要更多的索引组合时,只是因为 select个特定的列。您的索引大小将成倍增长。

但是,如果您确定只使用一次并总是查询这样的数据,然后随意为其建立索引,就可以了。

或者,如果您的计算机与Google云之间的连接带宽很小,以至于下载更多数据会导致您滞后。