【问题标题】:Firebase database check if element exists in a ListField in FlutterFirebase 数据库检查 Flutter 的 ListField 中是否存在元素
【发布时间】:2020-01-07 10:19:09
【问题描述】:

我在 firebase 上有一个由 ListFields 组成的实时数据库。在这些字段中,一个字段participants 是一个字符串列表和两个用户名。我想对 firebase 数据库进行查询,以便它返回 participants 列表中存在特定用户名的文档。

我的文档结构如下:

我想进行查询,以便 Firebase 返回 participants 列表包含 aniruddh 的所有文档。我正在使用 Flutter 和 flutterfire 插件。

【问题讨论】:

  • 不确定在 firebase 中是否可行。你必须得到所有参与者,然后在颤动中循环它们。
  • 您是否建议使用不同的结构,其中我有两个单独的字段 participant_0participant_1 这样我就可以运行 OR 查询来获取查询用户名是 @987654329 的文档@ 或 participant_1?
  • 是的,我会做这样的事情,不确定它是否会皱眉。示例Query query = query.where('participant_0 ', isEqualTo: participant_0 ); 检查查询是否为空,然后对参与者_1 进行第二次检查

标签: firebase flutter firebase-realtime-database


【解决方案1】:

您当前的数据结构可以轻松找到对话的参与者。但是,它并不容易找到用户的对话。


另一种使这更容易的数据结构是以这种格式存储参与者:

imgUrls: {},
participants: {
  "aniruddh": true,
  "trubluvin": true
}

现在您可以通过以下方式从技术上查询用户的对话:

db.child("conversations").orderByChild("participants/aniruddh").equalTo(true)

但这不会很好地扩展,因为您需要为每个用户定义一个索引。


正确的解决方案是添加第二个数据结构,称为倒排索引,它允许查找用户的对话。在您的情况下,可能如下所示:

userConversations: {
  "aniruddh": {
    "-LxzV5LzP9TH7L6BvV7": true
  },
  "trubluvin": {
    "-LxzV5LzP9TH7L6BvV7": true
  }
}

现在您可以通过简单的读取操作查找用户参与的对话。您可以扩展此数据结构以包含有关每个对话的更多信息,例如您希望在列表视图中显示的信息。

也可以在这里查看我的答案:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 2020-09-25
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多