有没有办法可以在 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:每个字段可能包含很多单词。
我尝试了上面的代码,但错误表明我只能使用
一次。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,如我在以下帖子中的回答所述: