【问题标题】:Is wildcard possible in Flutter Firestore query?Flutter Firestore 查询中是否可以使用通配符?
【发布时间】:2020-11-29 09:43:37
【问题描述】:

我的目标是从路径 'chat/$chattype/room/{roomID}/message' 流式传输数据库中的所有消息,在该路径中我需要查询所有消息,这些消息的文档中的字符串包含 'user1'它,没有明确指定房间 ID。似乎无法使用通配符,但是.. 是否可以改为查询:'chat/$chattype/room/'?

Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: _firestore
          .collection('chat/$chattype/room/{roomID}/message')
          .where("reciever", isEqualTo: "user1")
          .snapshots(),
      builder: (context, snapshot) {
        if (!snapshot.hasData) {
...

【问题讨论】:

    标签: flutter google-cloud-firestore stream-builder


    【解决方案1】:

    查询多个集合的唯一方法是使用collection group query,它查询具有给定名称的所有集合。

    所以:

    _firestore
          .collectionGroup('message')
          .where("reciever", isEqualTo: "user1")
          .snapshots(),
    

    另请参阅 collectionGroup() 的 Flutter 参考文档。

    【讨论】:

    • 我可以看到它是如何工作的,谢谢。但是,这不会对数据库造成很大的负担吗?我的意思是,如果我有一百万条消息必须搜索,而不是指定 $chattype,这会将其减少到可能只有 1000 次搜索?
    • Firestore 开发人员遥遥领先。 Firestore 的大部分性能来自索引;您将需要创建一个 collectionGroup 索引,或者当您第一次运行查询时,Firestore 将给出一条错误消息,其中包含一个链接,以便自动为您创建索引。性能完全没有损失。
    • 由于 Firestore 索引数据的方式,实际上并没有额外的负担。要允许集合组查询,您必须在该集合组上定义一个索引。该索引是 Firestore 开始查询的地方。写入数据是 Firestore 更常见的吞吐量限制,这就是为什么我建议为要查询的组中的集合找到一个唯一名称 (chat/$chattype/room/{roomID}/message)。因此,如果您在 Firestore 的其他地方也有 message 集合,则可能值得将它们命名为 chatroommessages
    • 感谢您的回答 :) 我将阅读有关 collectionGrouping 的更多信息。
    【解决方案2】:

    Firestore 查询不支持任何通配符。您必须能够构建一个集合的完整路径才能查询它。

    您可能还想查看collection group queries,它可以让您查询任何子集合中具有相同名称的所有文档。您也许可以对“消息”使用集合组查询来查询 所有 个房间的 所有 聊天类型的所有消息,如果需要,可以从那里应用过滤器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多