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"}

Я заметил, если я «JOIN» дочерние записи, которые были созданы следующим образом:

$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<0 например) и сортировка (date_updated DESC также, например).

ПРИМЕЧАНИЕ: дурачок — нетехнический термин

1

Решение

Есть ли метод для работы с ключами и ключами предков, который менее глуп, чем: $ entity-> key () -> pathEnd () [‘name’];

Ключи в хранилище данных представляют собой довольно сложную концепцию, поэтому их нельзя использовать так же, как вы предлагаете из своей работы с Mongo. Тем не менее, есть некоторые помощники на Google\Cloud\Datastore\Key класс, который немного упростит ваш код. Вы могли бы использовать pathEndIdentitifer на месте pathEnd()['name'], Например, $key->pathEndIdentifier(), Это очень полезно, особенно в тех случаях, когда вы можете не знать, использует ли ключ идентификатор или имя.

Кроме того, я не должен быть в состоянии обновить документ, предоставляя только ключ, и не имея необходимости указывать ключ предка?

К сожалению нет. Ключ формы [Parent: john, Child: junior] относится к совершенно другому объекту, чем ключ формы [Child: junior], Чтобы использовать родительские объекты, необходимо указать полный путь к ключу. Однако, если вы можете придумать способы сделать это проще для вас, пожалуйста, дайте мне знать, желательно подача вопроса. Я хотел бы выяснить, как сделать это проще — я знаю, что это немного сложно в настоящее время.

Наконец, могу ли я запросить сущности И их потомков без необходимости объединения (как я делаю выше), но все еще фильтруя (date_approved<0 например) и сортировка (date_updated DESC также, например).

К сожалению нет. Вы можете запросить либо один вид, либо ни одного (т.е. бездарный запрос). Этот последний тип может запрашивать несколько видов, но вы не можете выполнять фильтрацию по свойствам или значениям сущностей.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru