#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();
Это не сработает, он попросит вас ввести другой индекс.