在AppEngine数据存储中的筛选器中避免



我在Google DataStore上有两个实体:

A:

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

B:

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过滤器(太多的db调用(来实现这一点?

谢谢!

in过滤器实际上只是ORM提供的一个方便功能。在幕后,它正在做一系列OR来实现这一目标。

(value1,…,valueN(中的筛选器名称转换为(name=value1(OR。。。OR(name=valueN((也是一个DisjunctionNode(

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

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

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

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

我认为客户端库通过启动单独的查询来执行ORs,这就是为什么您会看到那些6db调用。我认为如果不重组数据,你将无法逃脱。

最新更新