首页 > 解决方案 > firestore:使用地图查询多个搜索词未按预期工作

问题描述

设想

我有一系列课程,我想根据用户输入的逗号分隔词搜索集合。但是,在执行查询时会返回所有课程集合。

Flutter 中的代码片段

    Future<void> search(List<String> keywords) async {
        var docs = coursesRef;
        // BELOW I ITERATE OVER KEYWORDS CONVERT
        // THEM TO LOWER CASE AND APPEND TERM TO MAP searchTerms
        keywords.forEach((word) {
          String term = word.trim().toLowerCase();
          docs.where('searchTerms.$term', isEqualTo: true);
        });
        docs.where('isDraft', isEqualTo: false);

        QuerySnapshot query = await docs.getDocuments();

        courses = [];
        query.documents.forEach((doc) {
          Course course = Course.fromDoc(doc);
          courses.add(course);
        });

        notifyListeners();
      }

我的地图字段如下所示:

在此处输入图像描述

返回的搜索结果

所有当前课程集合如下所示:

    {uid: 3riP6kUweNPF2EV7avD2, name: Chemistry, code: CHEM208, academy: American University of Beirut, academyCode: AUB, isDraft: false, keywords: [chem208, chem 208, chemistry]}
    {uid: KyyTpfEbbG8FhJbKvsuo, name: Math, code: MATH204, academy: American University of Beirut, academyCode: AUB, isDraft: false, keywords: [math204, math 204, math]}
    {uid: jTBaY0T2CHPUGKPg8tb8, name: Chemistry, code: CHEM200, academy: American University of Beirut, academyCode: AUB, isDraft: false, keywords: [chem200, chem 200, chemistry]}
    {uid: vcdLCmrwN4RPKDt7CeUX, name: Accounting, code: ACC 213, academy: American University of Beirut, academyCode: AUB, isDraft: false, keywords: [accounting, acc213, acc 213]}

给定

关键字仅包含术语数学

标签: fluttergoogle-cloud-firestore

解决方案


每次调用where(...)它都会返回一个新Query对象。因此,每次添加条件时都需要使用新查询更新变量:

var docs = coursesRef;
keywords.forEach((word) {
  String term = word.trim().toLowerCase();
  docs = docs.where('searchTerms.$term', isEqualTo: true);
});
docs = docs.where('isDraft', isEqualTo: false);

推荐阅读