Могу ли я фильтровать несколько полей при поиске в Firestore?

# #reactjs #firebase #react-native #google-cloud-firestore

Вопрос:

Я использую базу данных Firestore в своем приложении.
Теперь, можно ли искать определенное слово в нескольких полях?

Например: представьте себе слово типа «чизкейк». Теперь у меня есть 100 документов в коллекции, и каждый документ содержит 10 разных полей.
Могу ли я отфильтровать слово по всем полям, чтобы оно возвращало любой документ, содержащий слово «чизкейк» в любом из полей, в Flutter?

Ответ №1:

Нет, вы не можете этого сделать.
Просматривая страницу документации Firebase Firestore о запросах, вы узнаете о следующем:

Cloud Firestore не поддерживает следующие типы запросов:

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

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

Концепция обходного пути в Flutter

 final QuerySnapshot querySnapshot = 
  await Firestore.instance.collection('cakes').getDocuments();
final List<DocumentSnapshot> documents = 
  querySnapshot.documents.where((snapshot) => snapshot.data.containsValue('cheesecake'));
// now the [documents] object will only contain documents, which have "cheesecake" as any of their fields
 

Комментарии:

1. Я использую firestore. Как мы можем использовать условия where в этой ситуации — извлекать все разговоры в чате, где «(senderid == loggedinuserid и receiverid == 10) или (senderid == 10 и receiverid == loggedinuserid)»? пожалуйста, предложите. Спасибо.

2. @Kamlesh Firestore не поддерживает логические запросы ИЛИ. Вы можете либо выполнить оба запроса и объединить их на стороне клиента, либо, например, создать participants поле, в которое вы включаете обоих пользователей.

Ответ №2:

Как объяснил creativecreatorormaybenot, для вашего требования нет простого решения. Фильтрация на стороне клиента может занять много времени и денег, в зависимости от размера вашей базы данных.

Существует еще одна возможность, которая заключается в включении полнотекстового поиска в облачных документах Firestore с помощью службы поиска, размещенной на Algolia. Существует официальный пример облачной функции, который показывает, как это настроить: https://github.com/firebase/functions-samples/tree/Node-8/fulltext-search-firestore

Комментарии:

1. Я использую firestore. Как мы можем использовать условия where в этой ситуации — извлекать все разговоры в чате, где «(senderid == loggedinuserid и receiverid == 10) или (senderid == 10 и receiverid == loggedinuserid)»? пожалуйста, предложите. Спасибо.