Запрос Flutter Firestore с arrayContainsAny: список не работает

#firebase #flutter #dart #google-cloud-firestore

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

Вопрос:

С последней версией: Flutter cloud_firestore: ^0.14.0 2

Код:

       FutureBuilder(
      future: _sessionsLogCollection
          .where('companyId', isEqualTo: sPData.companyId)
          .where('locationId', arrayContainsAny: [
            '29L73oSzdQrzLUow3Mg9',
            'bugdWVC6RRtHoemuxNWE',
          ])
          // .where('locationId', isEqualTo: 'bugdWVC6RRtHoemuxNWE')
          .orderBy('openDateTime', descending: true)
          .get(),
  

У меня уже созданы индексы, так что это не проблема.

При использовании .where(‘LocationID’, равнозначно: ‘bugdWVC6RRtHoemuxNWE’) самостоятельно запрос возвращает правильные данные.

Но с .где(‘LocationID’, arrayContainsAny: [’29L73oSzdQrzLUow3Mg9′,’bugdWVC6RRtHoemuxNWE’]) сам по себе, он не выдает никакой ошибки, а просто возвращает пустой набор данных: sessionsSnapShot.data.documents.длина: 0.

** Решается с помощью .Где (Вероятно .where должен быть включен в firebase.flutter.dev/docs/ firestore /usage, поскольку в настоящее время его там нет)

Ответ №1:

Согласно вашему коду .where('locationId', isEqualTo: 'bugdWVC6RRtHoemuxNWE') , кажется, что locationId это не массив, а поле. Если вы хотите запросить массив, вы можете использовать только arrayContains и arrayContainsAny . Но поскольку это поле, то вы должны использовать whereIn :

           .where('locationId', whereIn: [
            '29L73oSzdQrzLUow3Mg9',
            'bugdWVC6RRtHoemuxNWE',
          ])
  

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

https://firebase.google.com/docs/firestore/query-data/queries#array_membership

https://github.com/FirebaseExtended/flutterfire/blob/master/packages/cloud_firestore/cloud_firestore/lib/src/query.dart#L393

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

1. Это сработало отлично. Проблема в том, что я не нашел .Где в firebase.flutter.dev/ docs / firestore /usage , но сейчас я вижу это в query.dart. Еще одна вещь, когда дело доходит до firebase.google.com/docs/firestore/query-data / … всегда ли синтаксис Flutter / Dart будет таким, как в Kotlin KTX?

2. Нет, kotlin ktx — это другой язык