我还没有找到任何关于此的文档,虽然它必须存在于某个地方,因为它相当简单。
我可以使用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"
}
我注意到我是否加入&#34;子记录,创建如下:
$childkey = $datastore->key('tasklist', $parentkey)
->pathElement('task', 'task001');
$entity = $datastore->entity($childkey, $myTaskArray);
$datastore->upsert($entity);
当我稍后通过&#34; parent&#34;关键:
$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"
}
是否有一种处理祖先的密钥和密钥的方法比:$ entity-&gt; key() - &gt; pathEnd()[&#39; name&#39;]; < / p>
例如,在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&lt; 0)和排序(例如,date_updated DESC)。
注意:goofball是一个非技术术语
答案 0 :(得分:1)
是否有一种处理祖先的密钥和密钥的方法比:$ entity-&gt; key() - &gt; pathEnd()[&#39; name&#39;]; < / p>
数据存储区中的键是一个相当复杂的概念,因此它们的使用方式与您使用Mongo的方式相同。但是,Google\Cloud\Datastore\Key
类上有一些帮助程序可以简化代码。您可以使用pathEndIdentitifer
代替pathEnd()['name']
。例如,$key->pathEndIdentifier()
。这非常有用,尤其是在您可能不知道密钥是使用ID还是名称的情况下。
另外,我不应该只通过提供密钥来更新文档,而不必指定祖先密钥吗?
不幸的是没有。表单[Parent: john, Child: junior]
的键是指与表单[Child: junior]
的键完全不同的实体。要使用父实体,您必须提供完整的密钥路径。但是,如果你能想出办法让你更容易,请告诉我,最好是filing an issue。我想知道如何让这更容易 - 我知道它现在有点复杂。
最后,我可以查询实体及其后代而无需进行连接(如上所述),同时仍然过滤(例如date_approved&lt; 0)和排序(例如,date_updated DESC)。
不幸的是没有。您可以查询任何一种或不查询(即a kindless query)。后一种类型可以查询多种类型,但不能对实体属性或值进行过滤。