2017-09-05 23 views
1

これはドキュメントが見つかりませんでしたが、どこかに存在する必要があります。Google Cloud Datastore:キーの操作

私は次のように(例えば)タスクリストのすべてのための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の祖先のキーとキーを操作するための方法がある「親」キーでentity-> key() - > pathEnd()['name'];例えば

は、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)); 

最後に、まだフィルタリングしながら、私は、(私は上記のやっているよう)の参加を行うことなく、エンティティとその子孫を照会することができます(たとえば< 0をdate_approved )とソート(date_updated DESCなど)

注:goofball非技術用語

答えて

1

ているが、より少ないgoofballの祖先のキーとキーを操作するための方法があります:$ ENTITY->キー() - > pathEnd() ['名'];

データストア内のキーはかなり複雑な概念なので、Mongoでの作業と同じように使用することはできません。しかし、コードを少し簡略化するGoogle\Cloud\Datastore\Keyクラスのヘルパーがいくつかあります。 pathEnd()['name']の代わりにpathEndIdentitiferを使用できます。たとえば、$key->pathEndIdentifier()です。これは、キーがIDか名前を使用するかどうかわからない場合に特に便利です。

また、キーだけを指定して先祖キーを指定する必要がないため、ドキュメントを更新することはできませんか?

残念ながら。フォーム[Parent: john, Child: junior]のキーは、フォーム[Child: junior]のキーとはまったく異なるエンティティを指します。親エンティティを使用するには、完全なキーパスを指定する必要があります。しかし、あなたがこれをより簡単にする方法を考えることができれば、私に知らせてください。filing an issueでお願いします。私はこれをより簡単にする方法を見つけ出すことが大好きです - 私はそれが現在少し複雑であることを知っています。

最後に、私はまだフィルタリングしながら、(例えば< 0をdate_approved)、(私は上記のやっているよう)の参加を行うことなく、エンティティとその子孫のために照会し(例えばもdate_updatedがDESC)をソートすることができます。

残念ながら。いずれかの種類のクエリまたはなしのクエリ(つまりa kindless query)があります。この後者の型は複数の種類を照会できますが、エンティティのプロパティや値のフィルタリングはできません。

+0

ありがとうございました@jdp - すべての回答があります。そして非常に役に立ちました。 –

関連する問題