我正在开发一个匹配的应用程序与Firebase xFlutter .

目标是创建一个函数,从Firestore的userCollection中筛选字段值,以检索符合条件的文档.

这三个论点如下.

  • 细绳?MyUid:我的单据ID.
  • 细绳?SeltedLanguage:包含指示语言代码的字符串的变量,如‘en’、‘es’等.
  • List<string?>meNativeLanguage:包含两个语言代码字符串的变量,如‘en’、‘es’等.

关于QUERIED_LANGUAGE字段,它包含一个字符串,如‘en’、‘es’等.

我执行了下面的代码,但我无法获得任何符合条件的文档ID.控制台上没有错误信息.

static Future<void> getUnmatchedUser(
String? myUid,
List<String?>? selectedLanguage,
List<String?>? meNativeLanguage,
List<String?>? selectedGender,) async{   
  QuerySnapshot<Map<String, dynamic>> querySnapshot = await _userCollection
      .where('matched_status', isEqualTo: false)
      .where('progress_marker', isEqualTo: false)
      .where(FieldPath.documentId, isNotEqualTo: myUid)
      .where("native_language", arrayContains: selectedLanguage![0])      
      .where(Filter.or(
         Filter("queried_language", isEqualTo: meNativeLanguage![0]),
         Filter("queried_language", isEqualTo: meNativeLanguage[1]))) 
      .limit(4) 
      .get();  
}

以下两点已提前排除故障.

  • (1)参数变量在运行时不为空.
  • (2)当在上述代码中只排除使用OR运算符的WHERE方法的情况下执行该函数时,可以获得与之匹配的文档ID.

基于以上内容,我认为问题出在使用OR查询的WHERE方法部分.

OR查询的使用方法遵循下面的官方指南. https://firebase.google.com/docs/firestore/query-data/queries?_gl=1*lz88cl*_up*MQ..*_ga*MTE2NzA2MjkzOC4xNzA3OTU4MzM0*_ga_CW55HF8NVT*MTcwNzk1ODMzNC4xLjAuMTcwNzk1ODMzNC4wLjAuMA..

请告诉我有什么问题,我将不胜感激.

=========================================================
According to the advice from comments, I used the hard-coded values to perform a built test like below.

  static Future<String?> getUnmatchedUser(
    String? myUid,
    List<String?>? selectedLanguage,
    List<String?>? meNativeLanguage,
    List<String?>? selectedGender,
    ) async{  
        try { 
          QuerySnapshot<Map<String, dynamic>> querySnapshot = await _userCollection
            .where('matched_status', isEqualTo: false)
            .where('progress_marker', isEqualTo: false)
            .where(FieldPath.documentId, isNotEqualTo: myUid)
            .where("native_language", arrayContains: 'en') 
            .where(Filter.or(
              Filter("queried_language", isEqualTo: 'ja'),
              Filter("queried_language", isEqualTo: 'es'))) 
            .limit(4) 
            .get();  

          print('querySnapshot.docs.length == ${querySnapshot.docs.length}');   

            if (querySnapshot.docs.isEmpty) {return null;}
            if (querySnapshot.docs.isNotEmpty) {
              List<DocumentSnapshot> docs = querySnapshot.docs;
              docs.shuffle();                                    
              DocumentSnapshot docSnapshotFirst = docs[0];
              print("talkuserUid: Document[0] ID: ${docSnapshotFirst.id}");
              return docSnapshotFirst.id;
            }    
              return null;
      } catch (e) {
        print('getUnmatchedUser: ERROR == $e');
        return null;
      }
    }
  • 补充:
    • 在if语句中,如果文档是GET,它将对数组进行置乱并返回[0]元素的id(请忽略它们,因为它们在此调试打印中并不相关).

下面是来自FiRestore控制台和VScode控制台的两个文档的屏幕截图,我认为这两个文档符合所有条件,但没有返回.

9lCMFwOVL80Oc9NtXmRu_fields 9lCMFwOVL80Oc9NtXmRu_console u2iftdNbIM0teYtUeen2_fields u2iftdNbIM0teYtUeen2_console

On device with Uid: u2iftdNbIM0teYtUeen2, 'querySnapshot.docs.length == 1' is expected, but it's 0.
(In the screenshots, the reason the process is repeated multiple times is that the function is being executed in a retry function and will be retried until the document succeeds)

推荐答案

您正在try 将queried_language与以下各项相匹配:

Filter("queried_language", isEqualTo: 'ja'),
Filter("queried_language", isEqualTo: 'es'))) 

但如果我们看一下屏幕截图,queried_language是一个数组--所以您需要use arrayContains来查看该数组是否包含特定值.

如果要测试多个值中的一个,可以使用具有多个条件的arrayContainsAny筛选器而不是Or筛选器.

Flutter相关问答推荐

Build.gradle专线:2个Flutter Flutter

无法让Riverpod Stream发出新值

在创建肘部并使用冻结时,无法使用中的Copy With方法

Flutter 蜂窝单元测试

video_player在Android上返回401 Unauthorized with Bunny CDN

Android上火焰瓷砖之间的线条飘动

Firebase WHERE过滤器在日期字段中不起作用

在Dart中使用Riverpod代码生成时出现问题(addListener)

Flutter在CustomPainter的右上角和左上角添加了2条曲线

Dart:未捕获错误:RangeError(索引):索引超出范围:索引应小于 7:7

允许文本小部件在容器之间溢出

无状态小部件被奇怪地重建

Container 的 Flutter 背景图片不会出现

这是使用导航功能处理从一页到另一页的移动的最佳方式

如何在 flutter 的 onChanged(更改字符)处更改 TextField 边框 colored颜色 ?

Show Snackbar above to showModalBottomSheet Flutter

我在弹出框中编辑后无法保存日期

无法将参数类型Future Function(String?)分配给参数类型void Function(NotificationResponse)?

从 Uint8List 或图像对象创建 InputImageData 用于 Google ML Kit 人脸检测

如何从 MemoryFileSystem 字节创建假 dart:io 文件?