【问题标题】:Firebase Firestore Mulitple Condition Clauses or Cloud Functions, with FlutterFirebase Firestore 多条件子句或云函数,带有 Flutter
【发布时间】:2021-11-27 23:07:12
【问题描述】:

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

在我的 Firestore 中,我有一个 Collection,在它的文档中,它有字段 State、City 和 Zone,都应该使用数组 contains 进行查询。

我会放手,但另一位程序员提到,通过 CloudFunctions,有一种方法可以获取多个数组查询,只是它会更慢。

因此,在一个完美的世界中,我应该能够使用区域数组 [Zone1、Zone2、Zone3]、城市数组 [圣地亚哥、洛杉矶、华盛顿] 和州数组 [CA, WA, NY] 并显示结果。

有什么想法吗?

【问题讨论】:

    标签: firebase flutter dart google-cloud-platform google-cloud-firestore


    【解决方案1】:

    正如@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

    【讨论】:

    • 有趣的是,如果我发送它会如何工作。查询我只想要一个区域、2 个城市、1 个州在这 2 个城市之一中有一个区域,例如我想要来自 Zones[Midtown]、Cities[Manhattan、Queens]、States=[NY] 之类的数据中城是曼哈顿的一个区域,并且还显示皇后区的所有热门歌曲,但也仅显示曼哈顿中城的热门歌曲?
    • 哦,我明白了。我只是更新我的答案。试一试,告诉我它是否有效。
    • 不客气,雷内。
    【解决方案2】:

    通过 CloudFunctions,有一种方法可以获取多个数组查询,但它会更慢。

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

    您可能想回到那个客户那里,询问他们是否可以澄清他们认为云功能可以如何在这里使用。除了突然出现的这个功能之外,他们可能还有其他想法。,

    【讨论】:

      【解决方案3】:

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

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

      等于 Zones [Zone1, Zone2, Zone3] 因为每个文档都应该是这样的

      { 州:'CA',城市:'旧金山',区域:'soma' }

      对于过滤器中只有州和城市的情况,然后过滤城市,当只有州时也是如此

      【讨论】:

      • 问题是有些城市没有区域,因此人们可能会选择城市中的某些区域,但可以选择完整的城市
      猜你喜欢
      • 1970-01-01
      • 2018-06-10
      • 2019-08-28
      • 1970-01-01
      • 2020-10-25
      • 2019-02-26
      • 2023-03-08
      相关资源
      最近更新 更多