Как использовать Where в flutter с firestore?

#firebase #flutter #google-cloud-firestore

#firebase #flutter #google-облако-firestore

Вопрос:

В проекте приложения flutter для электронной коммерции я использую shortInfo поле моей коллекции товаров в качестве уникального идентификатора для каждого продукта. При нажатии кнопки «Добавить в корзину» сохраняется поле « shortInfo в массив», вызываемое userCartList в моей users коллекции, и я использую Where для запроса этого массива, но когда у меня более 10 продуктов, мое приложение вылетает. Что я здесь делаю не так?

Вот моя структура firestore:

Сбор пользователей

Коллекция предметов

Вот фрагмент запроса, который я делаю:

 StreamBuilder<QuerySnapshot>( 
    stream: EcommerceApp.firestore
                        .collection("items")
                        .where("shortInfo", whereIn: EcommerceApp.sharedPreferences.getStringList(EcommerceApp.userCartList))
                        .snapshots()
)
  

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

1. Не могли бы вы предоставить фрагменты кода, которые вызывают ошибку?

2. StreamBuilder<QuerySnapshot>( //ЗАДАЧА: исправить проблему stream: EcommerceApp.firestore .collection(«items») .где(«shortInfo», где: EcommerceApp.SharedPreferences .getStringList(EcommerceApp.userCartList)) .snapshots(),

3. Этот код дает требуемый результат, но когда в соответствии с правилом firebase добавляется более 10 продуктов, этот запрос mothod не допускает более 10, что и вызывает ошибку. Список пользовательских корзин — это список, сохраненный в общих настройках, которые я извлекаю из firebase

Ответ №1:

Проблема здесь в том, что Firestore не позволяет вам выполнять запрос на членство в массиве с более чем 10 записями. Если вы проверите эту документацию, вы увидите, что:

Используйте in оператор для объединения до 10 предложений равенства (==) в одном поле с логическим ИЛИ

За кулисами ваш whereIn оператор выполняет тот же запрос, который показан в примере в документации, и если вы используете более 10 записей, Firestore не примет его, и вы получите сообщение об ошибке. Я предлагаю вам разбить EcommerceApp.userCartList массив на несколько массивов максимум с 10 записями для выполнения запроса, это позволит Firestore работать в whereIn пределах своих возможностей, и это будет работать.

Дайте мне знать, если у вас возникнут еще какие-либо вопросы по этому вопросу.

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

1. Я смог исправить эту проблему с помощью следующего кода: for (int i = 1; i < EcommerceApp.SharedPreferences .getStringList(EcommerceApp.userCartList) .length; i ) StreamBuilder<QuerySnapshot>( поток: EcommerceApp.firestore .collection(«items») .where(«shortInfo», равнозначно: EcommerceApp.SharedPreferences .getStringList(EcommerceApp.userCartList)[i]) .снимки (),