【问题标题】:Avoiding in Filter in AppEngine Datastore避免在 AppEngine 数据存储区中的过滤器
【发布时间】:2021-01-22 21:15:28
【问题描述】:

我在 Google DataStore 上有两个实体:

答:

id,  
name,  
.... a lot of other columns

乙:

id,  
Key(A, <id_of_A_record>) --> Reference Property A,  
URL,  
size  
... and more columns

我有一堆 A id,我想用这些 id 查询。 现在我可以使用

A_ids = [1, 2, 3, 4, 5, 6]
B.all().filter('A IN', A_ids).fetch(None)

但是,如果有 6 个 A_id,则有 6 个 db 调用,因此超出了 IN 的目的。他们有什么方法可以通过避免 IN 过滤器(太多的数据库调用)来实现这一点吗?

谢谢!

【问题讨论】:

    标签: google-app-engine google-cloud-platform google-cloud-datastore query-optimization


    【解决方案1】:

    in 过滤器实际上只是您的 ORM 提供的一个便利功能。在幕后,它正在做一系列的ORs 来实现它。

    将(value1, ..., valueN)中的过滤器名称转换为(name = value1) OR ... OR (name = valueN)(也是DisjunctionNode)

    https://googleapis.dev/python/python-ndb/latest/query.html#google.cloud.ndb.query.FilterNode

    即使 ORs 不受数据存储本身的支持,它只是由客户端库模拟:

    索引查询机制的性质对查询的功能施加了某些限制。数据存储模式查询不支持子字符串匹配、不区分大小写的匹配或所谓的全文搜索。 NOT、OR 和 != 运算符不受本机支持,但某些客户端库可能会在 Datastore 模式之上添加支持。

    https://cloud.google.com/datastore/docs/concepts/queries#restrictions_on_queries

    我认为客户端库通过启动单独的查询来执行ORs,这就是您看到这 6 个数据库调用的原因。我认为如果不重组数据,您将无法逃脱它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-11
      • 2013-04-25
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多