Какой индекс мне нужен в Google Cloud Datastore для фильтрации по ID и другому свойству? - PullRequest
0 голосов
/ 28 февраля 2019

Я использую Google Cloud Datastore для хранения объектов с сгенерированным идентификатором Datastore в качестве первичного ключа.Кроме того, я сохраняю другие свойства для каждой сущности, в этом примере owner.

Сущность выглядит в консоли Google Cloud Datastore следующим образом:

|Name/ID             |owner           |...|
|id=5657437197565952 |5634472569470976|...|

Затем я хочу отфильтроватьобъекты, основанные на key (id) и свойстве owner.

. Для этого я понимаю, что мне нужен составной индекс, чтобы иметь возможность фильтровать оба поля (id) и владельца одновременно.Поэтому я создал составной индекс, используя следующий файл index.yaml:

indexes:
- kind: job
  ancestor: no
  properties:
  - name: __key__
  - name: owner

# AUTOGENERATED

Индекс отображается в облачной консоли, и если я фильтрую оба поля с помощью пользовательского интерфейса облачной консоли, он фильтрует правильную сущность вТаблица.Фильтр, который я там использую:

  • Ключ точно такой же, как: key(job,5657437197565952)
  • Владелец равен строке: 5634472569470976

Нокогда я пытаюсь получить эту сущность с помощью библиотеки Node.js от Google, используя следующий код, я не получаю никакого результата:

const {Datastore} = require('@google-cloud/datastore');

async function quickStart() {
  const projectId = 'myproject';

  // Creates a client
  const datastore = new Datastore({
    projectId: projectId,
  });

  const keySelector = datastore.key(['myentity', '5657437197565952']);
  const query = datastore.createQuery('myentity').filter('key', keySelector).filter('owner', '=', '5634472569470976');

  const val = await query.run((err, entities, info) => {
    console.log(entities);
  });

  console.log('Got ' + val);
}
quickStart().catch(console.error);

entities пустые и val - это просто следующееесли строка:

[[],{"moreResults":"NO_MORE_RESULTS","endCursor":"CgA="}]

Я также пытался создать другой индекс с именем id вместо __key__, но безуспешно.

Мой вопрос сейчас: какой составной индекс делатьМне нужно выполнить этот фильтр для обоих полей, чтобы код NodeJS также правильно извлекал сущность?

1 Ответ

0 голосов
/ 28 февраля 2019

Поскольку у вас есть идентификатор ключа, вам больше не нужно беспокоиться о запросах, фильтрах и индексах: может быть максимум один объект, соответствующий такому запросу, который вы можете получить с помощью прямого поиска ключа думаю, что было бы чем-то вроде этого (извините, я не беглый node.js):

const key = datastore.key(['myentity', 5657437197565952]);
const entity = await datastore.get(key);

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

Но если вы настаиваете на фильтрации по ключу, то вам придется ссылаться на свойство с помощью специального __key__имя (как вы сделали в вашем индексном файле).От Фильтры :

Фильтры ключей

Чтобы отфильтровать значение ключа сущности, используйте специальное свойство __key__:

В вашем случае это будет примерно так:

const keySelector = datastore.key(['myentity', 5657437197565952]);
const query = datastore.createQuery('myentity')
                       .filter('__key__', '=', keySelector)
                       .filter('owner', '=', '5634472569470976');

Обратите внимание, что ключ id при создании объекта keySelector должен быть без кавычек!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...