Google数据存储区前置条件因时间戳而失败

时间:2016-05-19 22:22:25

标签: node.js gcloud google-cloud-datastore gcloud-node

您好我正在尝试从node.js api查询google datastore条目。我有一个实体,它有一个所有者(字符串),一个开始时间(日期时间)和一个结束时间(日期时间)我试图查询匹配给定所有者字符串的所有实体,并在给定日期之后开始以下功能(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

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

1 个答案:

答案 0 :(得分:4)

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

如果您列出了查询,则需要索引:

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

如果您确实希望开始日期为特定时间,则过滤器必须为:

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

您的订单中would have to specify it first

 .order('start')
 .order('end', {
    descending: true
  })