Google云数据存储:使用密钥

问题描述:

我还没有找到任何关于此的文档,尽管它必须存在某处,因为它相当简单。Google云数据存储:使用密钥

我可以查询使用PHP的所有任务列表(例如)如下:

$query = $datastore->query(); 
$query->kind('tasklist') 
     ->filter('date_approved', '<', 0) 
     ->order("date_approved") 
     ->order("date_updated", $query::ORDER_DESCENDING) 
     ->limit(50); 
$res = $datastore->runQuery($query); 

而且关键看(例如,用于更新),我一直在使用:

foreach($res as $r) { 
    $parentkey = $r->key()->pathEnd()['name']; 
    echo $parentkey; //"default" 
} 

我发现,如果我“加入”子记录,创建的,如下所示:

$childkey = $datastore->key('tasklist', $parentkey) 
       ->pathElement('task', 'task001'); 
$entity = $datastore->entity($childkey, $myTaskArray); 
$datastore->upsert($entity); 

当我后来对那些查询由“父”键:

$subquery = $datastore->query(); 
$subquery->kind('task') 
    ->filter('date_approved','<',0) 
    ->hasAncestor($datastore->key('tasklist', $parentkey)) 
    ->order("date_approved") 
    ->order("date_updated", $subquery::ORDER_DESCENDING); 
$subres = $datastore->runQuery($subquery); 

然后打印为子键的作用是相同的:

foreach($subres as $sr){ 
    $childkey = $sr->key()->pathEnd()['name']; 
    echo $childkey; //"task001" 
} 

是否有与祖先那是少goofball比钥匙和钥匙的工作方法:$实体 - >键() - > PATHEND()[ '名称'];

例如,在MongoDB中

$myobj = array(); 
$db->Insert($myobj); 
echo (string) $myobj['_id']; //key 

而且,我不应该能够单独提供的关键,而不必指定祖先键更新文档?

$childkey = $datastore->key('tasklist', $parentkey) 
      ->pathElement('task', "task001"); 
$entity = $datastore->lookup($childkey); 
$entity = $datastore->entity($childkey, $myUpdatedTaskArray); 
$datastore->update($entity, array("allowOverwrite"=>true)); 

与:

$childkey = $datastore->key('task', "task001"); 
$entity = $datastore->lookup($childkey); 
$entity = $datastore->entity($childkey, $myUpdatedTaskArray); 
$datastore->update($entity, array("allowOverwrite"=>true)); 

最后,我可以查询实体和他们的后代,而不必做一个连接(我敢上面做),同时还筛选(date_approved < 0为例)和排序(例如date_updated DESC)。

注:goofball是一个非技术术语

是否有与祖先的钥匙和钥匙那是少goofball比工作的方法:$实体 - >键() - > PATHEND() ['名称'];

数据存储中的键是一个相当复杂的概念,所以它们无法像使用Mongo一样使用。但是,Google\Cloud\Datastore\Key类中有一些帮助程序可以简化您的代码。您可以使用pathEndIdentitifer来代替pathEnd()['name']。例如,$key->pathEndIdentifier()。这非常有用,特别是在您可能不知道密钥是否使用ID或名称的情况下。

此外,我不应该能够通过单独提供密钥来更新文档,而不必指定祖先密钥?

不幸的不是。形式[Parent: john, Child: junior]的密钥指的是与形式为[Child: junior]的密钥完全不同的实体。要使用父实体,您必须提供完整的关键路径。但是,如果您能想出方法使您更容易,请通知我,最好通过filing an issue。我很想弄清楚如何使这更容易 - 我知道它目前有点复杂。

最后,我可以查询实体和他们的后代,而不必做一个连接(我敢上面做),同时还筛选(date_approved < 0为例)和排序(日期date_updated DESC还举例) 。

不幸的不是。您可以查询其中一种或不查询(即a kindless query)。后一种类型可以查询多种类型,但不能对实体属性或值进行过滤。

+0

谢谢@jdp - ALL SOLID答案。而且非常有帮助。 –