我有这个实体模型:
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
文件同步:
我甚至在开发者控制台中执行了手动查询,这也应该需要一个复合索引。同样成功:
如果没有复合索引,这种查询怎么能运行?我错过了什么?
更新:
几个小时后我执行了另一个类似的手动查询,结果再次正确,但这次Your Datastore does not have the composite index (developer-supplied) required for this query.
错误(或者我应该把它叫做警告?)出现了:
答案 0 :(得分:2)
仅使用相等过滤器的查询不需要创建复合索引。来自文档:
Cloud Datastore为以下表单的查询提供内置或自动索引:
- 仅使用祖先和相等过滤器的查询
https://cloud.google.com/datastore/docs/concepts/indexes#index_configuration