Реализация фильтрации на основе тегов Firestore - PullRequest
0 голосов
/ 01 мая 2020

У меня есть коллекция с полем под названием categories. Который содержит массив объектов ["cat1", "cat2", "cat3", "cat4", "cat5", "cat6", "cat7", "cat8", "cat9", "cat10", cat11 ]. (Более 10 категорий в массиве).

При попытке сделать whereArrayContainsAny выдает ошибку INVALID_ARGUMENT: A maximum of 10 'IN' or 'ARRAY_CONTAINS_ANY' filter values are allowed at once. Так что я не смогу принять этот массив как этот. Затем я читаю несколько статей, и они говорят, чтобы поддерживать карту данных, таких как,

catagories
  |_cat1 : true
  |_cat2 : false
  |_cat3 : false

Есть ли какие-либо проблемы с производительностью, если я использую этот метод? И есть ли способ использовать тот же метод массива, чтобы выполнять эту фильтрацию, когда категории превышают 10?

То, что я пробовал, это

Firestore db = FIRConnection.initFIRConnection();

// Create a reference to the cities collection
CollectionReference deliveries = db.collection("data");

// Create a query against the collection.
Query query = deliveries.whereArrayContainsAny("categories", Arrays.asList("cat1",
                "cat2", "cat3", "cat4", "cat5", "cat6", "cat7", "cat8", "cat9", "cat10", "cat11"));

// retrieve  query results asynchronously using query.get()
ApiFuture<QuerySnapshot> querySnapshot = query.get();

for (DocumentSnapshot document : querySnapshot.get().getDocuments()) {
    System.out.println(document.get("categories"));
}

1 Ответ

0 голосов
/ 01 мая 2020

Проблема, с которой вы столкнетесь при выборе этого варианта, заключается в том, что Firestore не поддерживает логические ИЛИ-запросы для нескольких полей . Если вы хотите узнать, установлена ​​ли в документе любая из N категорий, вам придется запросить каждую из N категорий по отдельности на клиенте. Возможно, это не то, что вам нужно, поскольку вы, возможно, будете читать документы много раз для каждого запроса.

Возможно, вам повезет, если разбить список категорий на партии по 10, запросив каждый пакет отдельно с помощью arrayContainsAny. затем объединяем результаты каждого из этих запросов на клиенте.

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