如果没有复合索引,多属性ndb查询如何成功?

时间:2018-02-21 00:20:38

标签: google-app-engine google-cloud-datastore app-engine-ndb

我有这个实体模型:

class ApartCILabel(ndb.Model):
    project_id = ndb.IntegerProperty(indexed=True)
    changeset_ids = ndb.IntegerProperty(repeated=True, indexed=True)   # ApartCIChangeset IDs
    # other properties

我最近为这些实体添加了一种新类型的查询:

            keys = ApartCILabel.query(ApartCILabel.project_id == self.db_data.project_id,
                                      ApartCILabel.changeset_ids == self.key_id).fetch(keys_only=True)
            if keys:
                label = Label(db_key=keys[0], handler=self.handler)
                logging.debug('label found: %s' % label.name)
            else:
                logging.error('label for %s not found' % self.lid)

我知道我需要一个复合索引,所以我在dev_appserver.py中运行了应用程序,用于自动更新我的index.yaml文件。我在日志中看到调试消息,表明查询成功:

DEBUG    2018-02-20 23:56:11,720 ci_changeset.py:70] label found: ACI_COPY_OF_SMALL_180221_1

令我惊讶的是,我的index.yaml文件中没有更新。好的,我上次需要更新索引(现在正在运行1.9.65)时,我确实更新了我的GAE SDK,也许基于符号链接的方案我用于在我的所有服务中共享我的索引定义文件干扰不知何故。没问题,我将在GAE上部署更改,并且我会在那里看到缺少的复合索引错误。

再次惊讶:查询成功,没有错误。

我查看了我的index.yaml文件,这种唯一的复合索引就是这个:

- kind: ApartCILabel
  properties:
  - name: project_id
  - name: created
    direction: desc

我仔细检查了开发人员控制台中的数据存储区索引,正如我预期的那样,它与index.yaml文件同步:

enter image description here

我甚至在开发者控制台中执行了手动查询,这也应该需要一个复合索引。同样成功:

enter image description here

如果没有复合索引,这种查询怎么能运行?我错过了什么?

更新:

几个小时后我执行了另一个类似的手动查询,结果再次正确,但这次Your Datastore does not have the composite index (developer-supplied) required for this query.错误(或者我应该把它叫做警告?)出现了:

enter image description here

1 个答案:

答案 0 :(得分:2)

仅使用相等过滤器的查询不需要创建复合索引。来自文档:

  

Cloud Datastore为以下表单的查询提供内置或自动索引:

     
      
  • 仅使用祖先和相等过滤器的查询
  •   

https://cloud.google.com/datastore/docs/concepts/indexes#index_configuration