Flutter 在 Firestore 中进行查询

问题描述 投票:0回答:1

有没有办法可以在 Firestore 中进行查询,其中查询包含 TextEditing 控制器的值?

TextEditingController fromController = TextEditingController();
TextEditingController toController = TextEditingController();

StreamBuilder(stream: FirebaseFirestore.instance
                      .collection("collectionPath")
                      .where("DepartureCity", arrayContains: [
                      fromController.text.toLowerCase(),
                      ])
                      .where("ArrivalCity", arrayContains: 
                       [toController.text.toLowerCase()])
                      .snapshots(),
                        builder: (context, snapshot){
                          try{}on FirebaseException catch (e){}
                        },
                      );

问题是我有两个文本字段。一个带有

fromController
,另一个带有
toController
。我希望查询从数据库返回一个列表,并以
where
作为参数。也就是说,如果在字段
fromController.text
中找到
DepartureCity
,并且如果在字段
toController.text
中找到
ArrivalCity
,则应显示列表。

我并不真正关心,但正在显示的列表。我更关心查询方面。

我尝试了上面的代码,但错误表明我只能使用

arrayContains
一次。

N/B:每个字段可能包含很多单词。

flutter firebase dart google-cloud-platform google-cloud-firestore
1个回答
0
投票

我尝试了上面的代码,但错误表明我只能使用

arrayContains
一次。

这是预期的行为。如果在同一个查询中使用多个

array-contains
调用,则会抛出这样的错误。

如果您的应用程序的用例需要同时过滤

fromController.text
toController.text
关键字,有一个解决方法可以帮助您解决此限制。

由于您无法使用

array-contains
,因此您必须对 Firestore 文档架构进行一些更改。因此,您应该考虑为每个单独的值创建一个新字段,然后链接多个 where() 调用。在同一个查询中多次调用此函数将完美地工作:

您的文档架构应如下所示:

departureCity: { 
    "keyword1": true,
    "keyword2": true,
    "keyword3": true
}

arrivalCity: { 
    "keyword4": true,
    "keyword5": true,
    "keyword6": true
}

如您所见,

DepartureCity
ArrivalCity
字段不再是数组,而是
Maps
(对象)。因此,使用这样的模式,您将能够同时找到与
keyword1
keyword4
匹配的所有文档。所需的查询如下所示:

db.collection('collectionPath')
    .where("departureCity.keyword1", "==", true)
    .where("arrivalCity.keyword4", "==", true);

其中

keyword1
代表
fromController.text
的值,
keyword4
代表
toController.text
的值。

您还可以通过所需的属性调用添加订单,但不要忘记创建一个 index,如我在以下帖子中的回答所述:

© www.soinside.com 2019 - 2024. All rights reserved.