2017-09-05 227 views
1

我還沒有找到任何關於此的文檔,儘管它必須存在某處,因爲它相當簡單。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是一個非技術術語

回答

1

是否有與祖先的鑰匙和鑰匙那是少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答案。而且非常有幫助。 –