PHP-GDS 对来自 AppEngine DataStore 的查询进行排序

PHP-GDS Sort queries from AppEngine DataStore

我已经使用 schema 创建了一个索引,使用 awesome PHP-GDS:

$obj_product_schema = (new Schema('Product'))
   ->addString('url')
   ->addString('date')
   ->addString('name', TRUE)
   ->addInteger('votes', TRUE);

但是,如果我按如下方式尝试 return 具有排序查询的对象子集,我会收到 'no matching index found' 错误。

$queryStr = "SELECT * FROM Product WHERE date='" . $dateQ . '" ORDER BY votes ASC ";
$obj_event_store->query($queryStr); 
$products = $obj_event_store->fetchPage(5);

错误:

Fatal error: Uncaught exception 'Google_Service_Exception' with message 'Error calling POST https://www.googleapis.com/datastore/v1beta2/datasets/app/runQuery: (412) no matching index found.'

当您将 "true" 放在参数上时,它确实为该单个参数创建了一个索引。我认为混淆是在单参数索引和复合索引之间(我刚刚看到 Tom 回答了您的 )。

虽然这些单参数索引确实适用于单参数查询(SELECT * FROM X WHERE Y = whatever,其中它只需要 Y 的索引),但当您在不同的参数上添加 order by 时,它需要一个复合索引( SELECT * FROM X WHERE Y = whatever ORDER BY Z,其中需要 Y 和 Z)。您不能直接在您的模式中声明它们,它们需要与您的应用程序一起上传(在一个名为 index.yaml 的文件中)。

这样想:您的数据存储当前有一个索引,其中唯一可用的信息是日期和对象的键。它还有另一个索引,其中可用的 only 信息是对象的投票和键。如果你要求一个有投票顺序的日期,它怎么知道要 return 什么?这就是为什么您需要添加一个索引,其中可用信息是日期 投票,以及对象的键,以便您的数据存储可以查找 table

附带说明:系统比以前更好了:它现在可以使用 ZigZag 合并算法从更简单的索引中创建更复杂的索引(尽管这仍然存在局限性,显然,性能受到影响)。

更多信息见