繁体   English   中英

Firebase Firestore 多条件子句或云函数,Flutter

[英]Firebase Firestore Mulitple Condition Clauses or Cloud Functions, with Flutter

我目前正在使用 Flutter 进行开发,我有一个问题,据我所知,根据 Firebase 文档:您只能使用一个Array Contains clause执行搜索。

在我的 Firestore 中,我有一个集合,在其文档中,它有字段 State、城市和区域,这些都应该使用数组包含进行查询。

我会让它 go,但另一个程序员提到,通过 CloudFunctions,有一种方法可以获取 Multiple Array Queries,只是它会更慢。

因此,在一个完美的世界中,我应该能够查询区域数组 [Zone1、Zone2、Zone3]、城市数组 [San Diego、Los Angeles、Washington] 和州数组 [CA、WA、NY ] 并显示结果。

有任何想法吗?

通过 CloudFunctions,有一种方法可以获取多数组查询,只是速度会慢一些。

Cloud Functions 通过 Admin SDK 访问 Firestore。虽然它是一个单独的 SDK,但大多数限制来自 Firestore 后端,而不是它的 SDK。在这种情况下,Admin SDK 也只能有一个array-contains子句。

您可能想通过 go 回复该客户并询问他们是否可以澄清他们认为如何在这里使用 Cloud Functions。 除了这个突然存在的功能之外,他们可能还有其他想法。

正如@FrankvanPuffelen 在他的回答中提到的,所有限制都来自 Firestore 后端。 因此,无论您使用哪一种,所有 SDK 都具有相同的约束条件。

您只能使用一个 Array Contains 子句执行搜索。

这是完全正确的。

因此,在一个完美的世界中,我应该能够查询区域数组 [Zone1、Zone2、Zone3]、城市数组 [San Diego、Los Angeles、Washington] 和州数组 [CA、WA、NY ] 并显示结果。

是的,但不幸的是,目前这是不可能的。 幸运的是,有一种解决方法可以帮助您获得相同的结果,但前提是您可以稍微更改文档的结构。 因此,您可能会考虑使用地图,而不是使用 arrays。 因此,您的新文档结构可能与此类似:

$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(...);

我会让它 go。

不要这样做,因为只需要对文档结构进行简单的更改。

编辑:

根据您的评论:

如果我发送查询我只想要一个区域,一个 2 个城市,1 State 有一个区域不在这两个城市之一,它会工作吗,例如我想要来自 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 - 在本地合并两个查询

在 Flutter 中,这将是这样的:

Flutter 将两个 firestore 流合并为一个 stream

你也可以考虑试试这个:

如何合并 Flutter 项目中的两个 firestore 查询以及如何从这两个流中删除重复文档?

和这个:

将 firebase 的两个不同的 collections 合并到 flutter

仅按“区域”过滤,这将产生您正在寻找的结果。 我在这里猜测您想使用 AND 进行过滤。 如果是这样,在你的情况下

区域 [Zone1、Zone2、Zone3] 和城市 [圣地亚哥、洛杉矶、华盛顿] 和州 [CA、WA、NY]

等于 Zones [Zone1, Zone2, Zone3] 因为每个文档都应该像

{ state: 'CA', city: 'San Francisco', zone: 'soma' }

对于您只有 state 和过滤器中的城市的情况,然后过滤城市,当只有州时相同

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM