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)。后一种类型可以查询多种类型,但不能对实体属性或值进行过滤。
谢谢@jdp - ALL SOLID答案。而且非常有帮助。 –