Как отфильтровать запрос из Firebase? - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть структура в Firebase, например: (База данных Realtime Database).

 community
 |--<communityID>
    |--cities
    |   |--<locationID>:boolean
    |   |--<locationID>:boolean
    |   |--<locationID>:boolean
    |--name
    |--users
    |-- ...
  |--<communityID>
    |--cities
    |   |--<locationID>:boolean
    |   |--<locationID>:boolean
    |   |--<locationID>:boolean
    |--name
    |--users
    |-- ...

С другими полями.

Мне нужно получить только те сообщества, где вcities список, который у них есть, совпадает с конкретным locationID.

В другом запросе я использовал что-то вроде этого:

firebaseDatabase.child("users").orderByChild("location").equalsTo(<cityID>)

Это прекрасно работает, когда ребенок location не является"массив".

Так есть ли способ сделать это?

Или мне просто нужно собрать все сообщества, а затем отфильтровать в устройстве?

Ответы [ 2 ]

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

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

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

Это прекрасно работает, когда дочернее местоположение не является «массивом».

Это работает, когда местоположение является свойством типа String, а не массива, потому что тип объектачто вы можете передать методу equalsTo() типа String, а не массива.

Так есть ли способ сделать это?

Чтобы справиться с этим, выдолжны дублировать ваши данные.Эта практика называется denormalization и является обычной практикой, когда дело доходит до Firebase.Если вы новичок в базах данных NoQSL, я рекомендую вам посмотреть это видео: Нормальная нормализация с базой данных Firebase для лучшего понимания.

Кроме того, когда вы дублируете данные, есть одинвещь, которую нужно иметь в виду.Точно так же, как вы добавляете данные, вы должны поддерживать их.Другими словами, если вы хотите обновить / обнаружить элемент, вы должны делать это в каждом месте, где он существует.

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

Firebase-root
  |
  --- comunityCities
         |
         --- locationID
                |
                --- communityID
                |      |
                |      --- //Community details
                |
                --- communityID
                       |
                       --- //Community details

Используя эту схему, вы можете просто запросить базу данных, чтобы получить все сообщества, которые соответствуют одному местоположению, используя следующие строки кода:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference comunityCitiesRef = rootRef.child("comunityCities");
comunityCitiesRef.addListenerForSingleValueEvent(/* ... */);

Вы можете прочитать больше информации в моем ответе из следующего поста:

Это ответ на вопрос Cloud Firestore, но те же правила применяются в случае базы данных Firebase в реальном времени.

Или мне просто нужно собрать все сообщества, а затем отфильтровать устройство?

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

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

Я предполагаю, что вы используете Friebase Firestore (а не базу данных в реальном времени).Проверьте это: https://firebase.google.com/docs/firestore/query-data/queries

Существует сравнение с именем "array_contains".Для котлина должна быть функция типа

val communityRef = db.collection("communityID")
val query = communityRef.whereArrayContains("cities", <locationID>)

Этого должно хватить в этом случае.


Кстати, если вы видите «Ограничения» в конце страницыв нем говорится:

Облачное хранилище пожаров не поддерживает ... Одиночные запросы для нескольких коллекций или вложенных коллекций.Каждый запрос выполняется к одному набору документов.Для получения дополнительной информации о том, как ваша структура данных влияет на ваши запросы, см. Выбор структуры данных.

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

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