Получить только выбранный объект из массива объектов gcloud datastore - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть эта структура в моем хранилище данных gcloud

"data": {
"obj": {
"added_time": "new Date().toUTCString()",
"person_id": 13,
"places": [{
    "place_id": 12,
    "place_name": "First Place",
    "place_type": "1",
    "fruits": [{
        "id": "1",
        "name": "orange"
      },
      {
        "id": "2",
        "name": "apple"
      }
    ]
  },
  {
    "place_id": 15,
    "place_name": "secondPlace",
    "place_type": "1",
    "fruits": [{
        "id": "1",
        "name": "Grapes"
      },
      {
        "id": "2",
        "name": "Banana"
      }
    ]
  }
 ]
 }
 }
 };

Я хочу запросить по add_time, person_id и place_id

Это мой составной индекс

indexes:
- kind: persons
  properties:
  - name: obj.person_id
  - name: obj.added_time
  - name: obj.places.place_id

Я пробовал этот запрос

  const query = datastore
.createQuery("persons")
.filter("obj.person_id", "=", 13)
.filter("obj.places.place_id", "=", 12);

Это работает, но дает мне и все другие места.Например, в этом запросе я должен получить только объект place с place_id 12, но я получаю другой объект с place_id 13, который не должен появляться.

1) Как получить только один объект?

2) Можно ли использовать оператор 'in' в хранилище данных, как places.place_id in (12,13)

Спасибо.

1 Ответ

0 голосов
/ 04 декабря 2018

Вы делаете (простой) запрос для вида persons, поэтому результаты будут persons сущностями, которые включают весь массив places.

Единственный способ получить *Объект 1006 *, имеющий только одно место в массиве places, должен выполнить запрос проекции .Технически вы получите массив таких persons сущностей - по одной для каждого подходящего места, но поскольку вы также фильтруете по place_id, массив будет содержать только один элемент.

Вам потребуетсяобратите особое внимание, так как вы также будете проецировать свойства массива, см. Проекции и свойства массива .А также проверьте связанные с проекцией ограничения на запросы .

Нет, фильтрация не поддерживает оператор IN, см. хранилище данных gcloud: можно ли фильтровать с помощью INили содержит оператор?

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