1

Много раз мне нужно только значение атрибута одного объекта. Поэтому нет необходимости получать всю Entity с помощью key.get().Google Datastore, получить конкретные свойства объекта

Я знаю, что проекционные запросы возвращают неполные объекты с указанными вами атрибутами. Значения указаны в индексе, поэтому нет необходимости получать объект из хранилища данных.

Мне интересно, если задан ключ, есть способ получить частичную сущность, получая информацию из индекса вместо хранилища данных, потому что я предполагаю, что получение из индекса будет быстрее, чем из хранилища данных.

Например что-то вроде: статей = some_key.get (проекция = [Article.title]) печати article.title

Существует способ сделать это? Это может быть новая функция?

EDIT: Кажется, что нет способа. Существующие индексы упорядочиваются по свойству. Единственный способ - создать способ создания индекса, упорядоченного по ключу, с свойством в одном столбце, но, похоже, не очень полезно иметь эти дополнительные индексы.

+0

Вы правы, что нет способа. –

+0

Благодарим за подтверждение.Попытавшись немного, я мог бы добавить поле свойств, сохраняющее значение ключа текущего объекта, поэтому оно сохраняется в индексе и упорядочивается по ключу, но я думаю, что это не стоит. В этом случае индекс будет выглядеть следующим образом: | key_property | название | __key__ | –

ответ

3

Без дополнительной информации это сильно пахнет преждевременной оптимизацией. Если вы не считаете, что потенциальная разница во времени представляет большую часть времени обработки, которую вы можете оптимизировать, вы работаете в неправильной области.

В качестве дополнительного примечания большая часть задержки при получении объекта - это латентность сети, не связанная с размером объекта. Если вы не работаете с большими объектами (xx-xxxx KiB), размер поиска данных будет тривиальным (если не меньше) воздействием на латентность.

Сказав это, если у вас есть большие сущности и действительно хотите попробовать, есть работа, чтобы эффективно делать то, что вы просите, все еще будучи строго последовательным.

Пример: Предположим, вы хотите получить свойства myField1 & myField2 из Kind myKind.

Вам нужен этот индекс:

- kind: myKind 
    ancestor: yes 
    properties: 
    - name: myField1 
    - name: myField2 

Предположим, идентификатор субъекта является MyId, и предприятие не имеет потомков, это можно сделать с помощью запроса:

select myField1, myField2 from myKind WHERE __key__ HAS ANCESTOR Key(myKind, myId) 

Примечание. Это может быть сделано для дочерних объектов, единственное требование - не иметь потомков одного и того же типа.

enter image description here

Это работает, потому что оператор HAS ANCESTOR будет также соответствовать предок, который в данном случае является лицо, вы ищете. Использование HAS ANCESTOR также заставляет запрос быть строго согласованным, то есть он будет вести себя так же, как get, который также сильно согласован.

Недостатком этого подхода является наличие сложного индекса, который включает в себя предков - для этого потребуется больше места для хранения. Другой недостаток - это, возможно, не быстрее. YMMV.

Смежные вопросы