【问题标题】:Firestore - Query multiple fieldsFirestore - 查询多个字段
【发布时间】:2020-07-14 23:58:55
【问题描述】:

我希望使用 Flutter + Firestore 构建一个简单的聊天应用,将用户和聊天存储在单独的集合中。每个聊天文档都有两个字符串字段 [uid1, uid2] 代表各个参与者的用户 ID。我需要能够搜索给定用户 (uid) 的所有聊天,因此可以通过将它们存储在数组字段中并使用 array_contains 来进行某种类型的 OR 查询。

但是,要更新聊天文档,我需要能够直接查询两个字段以检索两个用户之间的特定聊天,而使用数组方法是不可能的(不允许嵌套 array_contains)。即使将两者都存储为两个顶级字符串字段,也需要针对任一方向进行两次 Firestore 查询。

对于如何解决 Firestore 查询限制的任何建议?

【问题讨论】:

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


    【解决方案1】:

    您可以创建一个复合字段,其中包含查询所需的所有数据,方法是将两个用户 ID 连接到一个字符串中。请务必在执行此操作之前对 ID 进行排序,以确保它们具有可预测的顺序。

    因此,如果您有用户“A”和用户“B”,您的复合字段值将只是“AB”(而不是“BA”),您可以过滤此字段以查找这两者之间的所有消息用户。

    【讨论】:

    • 感谢道格!但是,假设用户“A”有聊天“AB”“AC”“AD”,我怎么能制定一个 Firestory 查询来检索用户 A 的所有聊天,即。 “A*”查询?
    • 你为什么不使用一个只有“A”的不同字段呢?
    • 我想这仍然有点笨拙,我必须存储三个字段:chat_id:“AB” uid1:“A”,uid2:“B”。并执行两个查询来查找用户 A 的所有聊天记录(一个针对 uid1,一个针对 uid2)
    • 复制数据以支持查询在 nosql 类型数据库中极为常见。
    • 我正在使用 Firestore。在这种情况下,我们如何使用 where 条件 - 获取“(senderid == loggedinuserid and receiverid == 10)或(senderid == 10 and receiverid == loggedinuserid)”的所有聊天对话?请建议。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2019-04-08
    • 2019-08-23
    • 1970-01-01
    相关资源
    最近更新 更多