我有一个包含100个Longs的列表,以及一个包含Long字段的Entity类型。我想找到其字段值在列表中的所有实体。
我在想,“太棒了!我只会写where :p1.contains(field)
,”但是AppEngine只会在不到31个元素(新的Baskin Robbins的口号?)中将其分开。所以,现在我想我必须将100的列表分成30个多个列表。
但是在这一点上,我希望有一个单线镜头,我意识到我可以做类似
的事情for (Long number : list)
GQL("select * from Kind where field = " + number)
基本上自己分裂成所有子查询。我的问题是......这相当于让appengine将我的30个列表分成30个单独的查询吗?或者是否有一些后端魔法可以同时获取所有30个子查询?
答案 0 :(得分:4)
子查询在功能上与常规查询相同。目前,子查询是串行运行的,所以自己动手并不比让SDK为你做的慢。但是,在将来,子查询可能会并行执行,这使得它们比自己执行更有效。也可以将“IN”等功能推送到后端,完全避免应用服务器中的问题。
但是,您应该知道,任何需要您执行100个查询的内容都会非常非常慢。如果可以的话,你应该找到一种方法来解决这个问题,而无需进行大量的查询和合并结果。
答案 1 :(得分:1)
该函数可能使用IN(arg1,arg2,...)运算符。
A single query containing != or IN operators is limited to 30 sub-queries.
列表中的每个项目都计为一个子查询,因此您只能使用该查询样式一次获取30个项目。
答案 2 :(得分:0)
使用SELECT * FROM YourKind WHERE value IN list_property
将导致运行多个子查询。这些子查询限制为30个。
使用SELECT * FROM YourKind WHERE list_property = value
将使用为list_property
构建的索引,因此应该使用与list-property可以包含†的条目一样多的条目。
†我认为这仅限于5000 max items for an index