【问题标题】:Google Cloud Datastore: Working with KeysGoogle Cloud Datastore:使用密钥
【发布时间】:2018-02-14 05:04:38
【问题描述】:

我还没有找到任何关于此的文档,尽管它必须存在于某个地方,因为它相当简单。

我可以使用 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"
}

有没有一种方法可以处理祖先的键和键,比:$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));

最后,我可以查询实体及其后代,而无需进行连接(就像我在上面所做的那样),同时仍然过滤(例如 date_approved

注意:goofball 是一个非技术术语

【问题讨论】:

    标签: php google-cloud-datastore google-cloud-platform


    【解决方案1】:

    有没有一种方法可以处理祖先的键和键,比:$entity->key()->pathEnd()['name'];

    数据存储区中的键是一个相当复杂的概念,因此它们不能完全按照您在使用 Mongo 时所建议的方式使用。但是,Google\Cloud\Datastore\Key 类中有一些帮助程序可以稍微简化您的代码。您可以使用pathEndIdentitifer 代替pathEnd()['name']。例如,$key-&gt;pathEndIdentifier()。这非常有用,尤其是在您可能不知道密钥使用 ID 还是名称的情况下。

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

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

    最后,我可以查询实体及其后代,而无需进行连接(就像我在上面所做的那样),同时仍然过滤(例如 date_approved

    很遗憾没有。您可以查询一种或无(即a kindless query)。后一种类型可以查询多种类型,但不能对实体属性或值进行过滤。

    【讨论】:

    • 谢谢@jdp——所有可靠的答案。而且很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    相关资源
    最近更新 更多