2

您好我正在尝试从 node.js api 查询谷歌数据存储条目。我有一个实体,它有一个所有者(字符串)、一个开始时间(日期时间)和一个结束时间(日期时间)我正在尝试查询与给定所有者字符串匹配并在给定日期之后使用以下内容开始的所有实体功能(es2016)。

static async getAvailability (owner, month = currentMonth) {
    const firstOfMonth = moment([currentYear, month])
    const query = datastore.createQuery('availability')
      .filter('owner', '=', owner)
      .filter('end', '>', firstOfMonth.toDate().toJSON())
      .order('end', {
        descending: true
      })
    try {
      // promise version of run query same function
      const result = await datastore.runQueryAsync(query)
      return result.map(result => {
        const { key, data } = result
        data._id = key.id
        return data
      })
    } catch (e) {
      console.log('error', e.stack)
      return []
    }
}

index.yaml 索引

- kind: availability
  properties:
  - name: owner
  - name: start
    direction: desc
  - name: end
    direction: desc

我在运行查询时收到错误前提条件失败错误。如果我能提供更多信息,我会非常高兴。

4

1 回答 1

4

您列出的查询仅在owner和上end。当您使用 Cloud Datastore 时,您使用的索引必须与查询完全匹配。

对于您列出的查询,您需要索引:

- kind: availability
  properties:
  - name: owner
  - name: end
    direction: desc

如果您实际上希望您的开始日期是一个特定的时间,您的过滤器必须是:

  .filter('start', '>', firstOfMonth.toDate().toJSON())

必须先在订单中指定它:

 .order('start')
 .order('end', {
    descending: true
  })
于 2016-05-20T20:05:34.957 回答