Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 如何对优化的仅关键帧查询进行排序_Sorting_Google Cloud Datastore - Fatal编程技术网

Sorting 如何对优化的仅关键帧查询进行排序

Sorting 如何对优化的仅关键帧查询进行排序,sorting,google-cloud-datastore,Sorting,Google Cloud Datastore,我使用datastore原生api访问gae数据库(出于经过充分研究的特定原因)。我想优化代码并在请求中使用memcache,而不是直接获取值,问题在于我的查询是排序的 当我执行findProductsByFiltersQuery.setKeysOnly()时在我的查询中,我收到以下错误: 提供的键只需在多个查询中执行一些排序 记忆。因此,此查询只能按键排序 属性,因为这是内存中唯一可用的属性 奇怪的是,它是从请求的某种复杂性开始发生的,例如,该请求失败: SELECT __key__ FROM

我使用datastore原生api访问gae数据库(出于经过充分研究的特定原因)。我想优化代码并在请求中使用memcache,而不是直接获取值,问题在于我的查询是排序的

当我执行
findProductsByFiltersQuery.setKeysOnly()时在我的查询中,我收到以下错误:

提供的键只需在多个查询中执行一些排序 记忆。因此,此查询只能按键排序 属性,因为这是内存中唯一可用的属性

奇怪的是,它是从请求的某种复杂性开始发生的,例如,该请求失败:

SELECT __key__ FROM Product WHERE dynaValue = _Rs:2 AND productState = PUBLISHED AND dynaValue = _RC:2 AND dynaValue = RF:1 AND dynaValue = ct:1030003 AND dynaValue = _RS:4 AND dynaValue = _px:2 AND itemType = NEWS ORDER BY modificationDate DESC
当这一条通过时:

SELECT __key__ FROM Product WHERE itemType = CI AND productState = PUBLISHED ORDER BY modificationDate DESC
有人能告诉我为什么会发生这种情况,如果在获取钥匙时无法订购,这是什么功能吗由于结果是分页的,所以从第一个筛选请求中获取一组错误的密钥是无用的。那它是怎么想的

还请注意,当我执行非
keysOnly
超长请求时,我会收到此消息

拆分提供的查询需要创建过多的子查询 合并到内存中


有人能解释一下,当值被索引时,内存中怎么可能有处理?还是只有devmode服务器才会发生此错误?

当您使用
中的
时,内存中的查询是必需的=数据存储中的运算符。同样,使用这些运算符的查询在客户机中被拆分为多个数据存储查询。例如:

SELECT * FROM Foo WHERE A = 1 OR A = 2
分为两个查询:

SELECT * FROM Foo WHERE A = 1
SELECT * FROM Foo WHERE A = 2
如果向查询中添加
orderby B
,则两个子查询都会获得此订单:

SELECT * FROM Foo WHERE A = 1 ORDER BY B
SELECT * FROM Foo WHERE A = 2 ORDER BY B
虽然每个数据存储查询都返回按B排序的结果,但查询的并集不是。在客户端,SDK合并B排序的两个结果

为了做到这一点,数据存储查询必须实际返回ordered属性,否则SDK将不知道将这些属性合并在一起的正确方法


如果使用大量筛选器编写查询,请确保仅使用
筛选器。这将允许仅在数据存储中执行所有操作,在这种情况下,不需要内存内排序。

您可以提供用于创建查询的代码吗?我回答您的问题时假设您的查询实际具有OR、in或!=使用的过滤器。如果您只使用和筛选器,则不应该出现这些错误。确保您的SDK是最新的,如果是,请提交一个bug:嗨,Patrick,谢谢您的解释。我仍然没有检查我的查询是否包含OR运算符(因为System.out和System.err之间可能存在线程同步差异),无论如何,这是一条很好的探索之路。如果我真的只有和条件,我将提交一个bug(但这对我的解决办法没有帮助:)p.s:生成查询的代码非常复杂,但我使用的是CompositeFilterOperator.AND()方法(因此乍一看不应该有任何OR操作,我必须在代码树中进行更深入的检查),也许我使用了!=然而,运营商
SELECT * FROM Foo WHERE A = 1 ORDER BY B
SELECT * FROM Foo WHERE A = 2 ORDER BY B