正如@FrankvanPuffelen 在他的回答中提到的那样,所有限制都来自 Firestore 后端。因此,无论您使用哪一个,所有 SDK 都共享相同的约束。
您只能使用一个 Array Contains 子句执行搜索。
完全正确。
因此,在一个完美的世界中,我应该能够使用区域数组 [Zone1、Zone2、Zone3]、城市数组 [圣地亚哥、洛杉矶、华盛顿] 和州数组 [CA, WA, NY] 并显示结果。
是的,但遗憾的是目前还不可能。幸运的是,有一种解决方法可以帮助您获得相同的结果,但前提是您可以稍微更改文档的结构。因此,您可以考虑使用地图,而不是使用数组。因此,您的新文档结构可能类似于以下内容:
$docId
|
--- zones (map)
| |
| --- zone1: true
| |
| --- zone2: true
| |
| --- zone3: true
|
--- cities (map)
| |
| --- San Diego: true
| |
| --- Los Angeles: true
| |
| --- Washington: true
|
--- states (map)
|
--- CA: true
|
--- WA: true
|
--- NY: true
例如,要获取“states”包含“CA”且“cities”包含“LA”且“zones”包含“zone1”的所有文档,您可以使用三个连续的where() 调用,如您所见在以下查询中:
Query query = db.collection("collName")
.where("states", isEqualTo: "CA")
.where("cities", isEqualTo: "LA")
.where("zones", isEqualTo: "zone1");
query.get().then(...);
我会放手的。
不要这样做,因为只需要对文档结构进行简单的更改。
编辑:
根据您的评论:
如果我发送查询我只想要一个区域、2 个城市、1 个州在这 2 个城市之一中拥有一个区域,它会起作用吗,例如,我想要来自 Zones[Midtown]、Cities[Manhattan] 的数据, Queens], States=[NY] 像这样将中城作为曼哈顿的一个区域,并且还显示皇后区的所有热门歌曲,但也仅显示曼哈顿中城的热门歌曲?
不,不会。你不能通过两个城市。但如果您创建两个单独的查询,它将起作用。第一个是:
Query firstQuery = db.collection("collName")
.where("states", isEqualTo: "NY")
.where("cities", isEqualTo: "Manhattan") //First state
.where("zones", isEqualTo: "Midtown");
第二个:
Query secondQuery = db.collection("collName")
.where("states", isEqualTo: "NY")
.where("cities", isEqualTo: "Queens") //Second state
.where("zones", isEqualTo: "Midtown");
获得每个查询的结果后,您就可以在客户端上加入它们。对于 Android,这将是:
Firestore - Merging two queries locally
在 Flutter 中,应该是这样的:
Flutter merge two firestore streams into a single stream
你也可以考虑试试这个:
How to merge two firestore queries in the Flutter project and How do I remove the duplicate documents from these two streams?
还有这个:
combine two different collections of firebase in flutter