如何解决避免在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
我认为客户端库通过启动单独的查询来执行OR
,这就是为什么您看到这6个db调用的原因。我认为如果不重组数据就无法逃脱。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。