代码之家  ›  专栏  ›  技术社区  ›  Dan Cornilescu

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

  •  3
  • Dan Cornilescu  · 技术社区  · 6 年前

    我有这个实体模型:

    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
    

    令我惊讶的是,我的 指数亚马尔 文件好的,自从上次我需要索引更新(运行)以来,我确实更新了我的GAE SDK 1.9.65 现在),也许我在所有服务中共享索引定义文件时使用的基于符号链接的方案会产生某种干扰。没问题,我将在GAE上部署更改,并在那里看到丢失的复合索引错误。

    再次令人惊讶的是:查询成功,没有错误。

    我检查了我的 指数亚马尔 文件,这种类型的唯一复合索引是:

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

    我在开发人员控制台中仔细检查了数据存储索引,正如我所料,它与 指数亚马尔 文件:

    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 回复  |  直到 6 年前
        1
  •  2
  •   Tony P.    6 年前

    仅使用相等筛选器的查询不需要创建复合索引。从文档中:

    云数据存储提供 内置的 ,或自动索引,用于以下形式的查询:

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

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