PHP-GDS从AppEngine DataStore中排序查询

时间:2015-02-26 13:01:37

标签: php google-app-engine google-cloud-datastore

我使用了很棒的PHP-GDS使用架构创建了一个索引:

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

但是,如果我尝试按如下方式返回带有排序查询的对象子集,则会得到“未找到匹配的索引”。错误。

$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.'

1 个答案:

答案 0 :(得分:3)

当您在参数上添加“true”时,它确实为该单个参数创建了一个索引。我认为混淆是在单个参数索引和复合索引之间(我刚刚看到你的other question由Tom回答)。

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

以这种方式思考:您的数据存储区当前有一个索引,其中可用的唯一信息是日期,以及对象的密钥。它还有另一个索引,其中唯一信息可用于投票和对象的密钥。如果你通过投票订单要求约会,它将如何知道返回什么?这就是为什么你需要添加一个索引,其中可用的信息是日期投票,以及对象的密钥,因此您的数据存储可以查找到该表

作为旁注:系统已经比以前更好了:它现在可以使用ZigZag合并算法从更简单的算法中制作更复杂的索引(尽管如此,仍有局限性,显然,性能受到影响)。

related answer

中的更多信息