Как использовать whereToEqual для массива подобъектов с неизвестным полем - PullRequest
0 голосов
/ 05 мая 2018

Позвольте мне показать вам структуру документа Firestore.

enter image description here

Как я могу сравнить значения массива stops? потому что время 12:00 PM будет отличаться для каждой записи в отправлении.

Так что на самом деле я хочу получить значение buss, где заданное мной значение соответствует любому значению массива stops.

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Согласно ответу @Frank van Puffelen, поскольку Firestore не поддерживает запросы к членам массива, вам следует немного изменить структуру базы данных. Поэтому вместо использования массивов вы должны использовать maps. Поэтому внутри каждого документа вам нужно добавить map, который будет выглядеть так:

Firestore-root
   |
   --- buses (collection)
        |
        --- busId (document)
              |
              --- buss: "/buss/OdGpiY..."
              |
              --- stops (map)
                    |
                    --- IQdng...526MpZ: true
                    |
                    --- pnwJ...4P3ef: true

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

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference busesRef = rootRef.collection("buses");
Query query = busesRef.whereEqualTo("stops.IQdng...526MpZ", true);
0 голосов
/ 05 мая 2018

Из документации Firestore для массивов :

Хотя Cloud Firestore может хранить массивы, он не поддерживает запросы к членам массива или обновление отдельных элементов массива.

Чтобы разрешить запрашивать маршруты, содержащие определенную остановку, вам следует сохранить дополнительное поле в документе, который содержит остановки в виде набора:

stops
  IQdng...526MpZ: true

Теперь вы можете запросить маршруты с этой остановкой, выполнив:

routesRef.whereEqualTo("stops.IQdng...526MpZ", true)

Вам по-прежнему понадобится исходная структура для остановок, поскольку это единственный способ узнать порядок остановок и время каждой остановки.

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