Поиск данных / значений / ключей в документах firestore

#flutter #dart

#flutter #dart

Вопрос:

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

 getBookbyTitel(query) async{
    return await Firestore.instance
        .collection("book")
        .where("titel", isEqualTo: query)
        .getDocuments();
}
  

но с этим кодом я могу выполнять поиск только по названию. как я могу выполнить поиск трех других ключей одновременно?
Спасибо

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

1. Добавьте еще один .where .

Ответ №1:

     getBookbyTitel(query) async{
        return await Firestore.instance
        .collection("book")
        .where("titel", isEqualTo: query).where("author", isEqualTo: query2).where("genre", isEqualTo: query3).
where("code", isEqualTo: query4).getDocuments();
    }
  

Ответ №2:

Преимущество Firestore в том, что индексы сложные и простые.

 getBookbyTitel(query,query2,query3) async{
return await Firestore.instance
.collection("book")
.where("genre", isEqualTo: query)
.where("title", isEqualTo: query2)
.where("code", isEqualTo: query3)
.getDocuments();
  

Фактических ограничений на количество .where(), которые вы можете использовать, нет, однако это то, что называется «сложным запросом», и поэтому в первый раз произойдет сбой, потому что firestore необходимо сначала проиндексировать.

Итак, сначала запустите приведенный выше код, в консоли появится сообщение об ошибке с URL-адресом, который отправит вас в ваш проект firebase, а затем он сам начнет индексирование, поэтому при следующем запуске этого кода он сделает это молниеносно.

Однако есть недостаток, для каждого используемого вами .where() для правильной работы потребуется дополнительная индексация. Имейте в виду, что порядок тоже важен, если вы запрашиваете по порядку [название, автор, жанр, код], вы всегда должны делать это таким образом, иначе он обнаружит это как совершенно другой запрос и попросит вас снова проиндексировать.

Наконец, существует также проблема, заключающаяся в том, что, например, более конкретный запрос отличается от запроса с меньшим количеством атрибутов. т. е:

 getBookbyTitel(query,query2,query3) async{
return await Firestore.instance
.collection("book")
.where("genre", isEqualTo: query)
.where("title", isEqualTo: query2)
.where("code", isEqualTo: query3)
.getDocuments();
  

Если у вас есть этот запрос, а затем попробуйте это вместо:

 getBookbyTitel(query,query2,query3) async{
return await Firestore.instance
.collection("book")
.where("genre", isEqualTo: query)
.where("title", isEqualTo: query2)
.getDocuments();
  

Это не сработает, он попросит вас ввести другой индекс.