Чтобы понять, как эти запросы работают (или не работают), важно понять, как хранилище данных индексирует сущности. Когда вы вставляете сущность со свойством списка, хранилище данных разбивает каждую запись списка на отдельную строку индекса. Например, следующая сущность:
Entity(User):
id=15
name="Jim"
interests=["Drinking", "Banjos"]
В результате автоматические индексы приведут следующие записи индекса:
(User, "id", 15, Key("User", 1))
(User, "name", "Jim", Key("User", 1))
(User, "interests", "Drinking", Key("User", 1))
(User, "interests", "Banjos", Key("User", 1))
Если вы также определили составной индекс (имя, интересы), записи в нем будут выглядеть примерно так:
("Jim", "Drinking", Key("User", 1))
("Jim", "Banjos", Key("User", 1))
После этого мы можем обратиться к вашим конкретным запросам в следующем порядке:
- Это невозможно, поскольку каждая запись находится в отдельной строке индекса. Вы можете индексировать это, создав список с одной записью для каждого подмножества интересов, и выполнить запрос на равенство, но он быстро растет с увеличением количества интересов, поэтому, вероятно, будет плохой идеей, если вы ожидаете, что у пользователя будет больше скажем, 5 интересов, или если вы не можете наложить больше ограничений на проблему.
- Вы можете использовать фильтр «IN» - например, «SELECT * FROM пользователя, ГДЕ ИНТЕРЕСУЕТСЯ В [« Drinking »,« Banjos »]» - он будет соответствовать любой записи, в которой есть хотя бы один из «Drinking» и «Banjos» как интересы. Обратите внимание, что это будет разбито на несколько подзапросов равенства в SDK, поэтому это эквивалентно выполнению столько запросов, сколько у вас есть записей в списке запросов.
- Это обратное значение 1. Опять же, это не очень практично, если вы не сохранили полный (отсортированный) список интересов в виде строки и не готовы выполнить отдельный запрос для каждого подмножества вашего списка подарков.
- Если я не ошибаюсь, это то же самое, что и 2 - вы ищете какое-либо пересечение между двумя наборами, что является симметричной операцией.
Для чисел 1 и 3 вы можете обойтись, применив более грубый фильтр, например, выполнив поиск по одному или двум интересам, и отфильтровав результаты в памяти для точных совпадений.