我正在开发一个匹配的应用程序与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)