【问题标题】:Firebase search for users with same username/ database structureFirebase 搜索具有相同用户名/数据库结构的用户
【发布时间】:2020-04-05 10:43:32
【问题描述】:

我的数据库结构中的用户具有用户创建帐户时创建的用户名。用户名位于元数据下方。我已经有 2000 多个用户,并且从未想过限制用户名/确保在人们使用 facebook 或 google 登录时不会重复或附加数字(在这些情况下,我目前只是使用他们的名字)。我希望能够搜索用户名:

  "Users" : {
    "eOhY4Wp6QNUtEjVTdmBff8UDY5p2" : {
      "meta" : {
        "username" : "testName"
      }
    }
  }

我认为唯一的方法是创建另一个反向列出用户名的部分:

"UserList" : {
        "testName" : "eOhY4Wp6QNUtEjVTdmBff8UDY5p2",
      }

但问题是我不能有多个用户具有相同的用户名/我认为不可能有多个节点具有相同的密钥。

这是处理这种情况的最佳方法吗?或者是否有其他方法可以使用相同的用户名(我不想使用快照来下拉整个用户,因为这将是超级数据密集型的)。如果这是我认为最好的方法,我会进入并手动更改数据库中已经存在的重复项。

编辑的附加内容:

这是我所知道的从第一个结构中获取用户名的唯一方法是获取整个快照,然后使用用户名过滤用户 - 这将下载整个快照,这是超级数据密集型,因为我只需要用户具有我正在搜索的用户名:

const snapshot = await firebase.child("Users").on("value")

我知道有 OrderBy 方法,但这不是顶级方法吗/我不需要直接在用户下方而不是更深 2 层的“testName”。

    const snapshot = await firebase.child("Users").orderByChild("username")
   .equalTo('testName')

【问题讨论】:

  • 我很难解析你的问题。请记住,“这是最好的方法”很少是一个很好的问题,所以我建议针对“为什么我的代码执行 abc,而我希望它执行 xyz?”由于您没有共享代码,因此很难提供帮助。 “我希望能够搜索用户名”是什么阻止了你这样做?
  • @FrankvanPuffelen 我添加了一些示例代码,这是我知道如何下拉整个用户列表的唯一方法(然后我将使用 javascript 使用地图或过滤器函数)。这是超级低效的。有没有办法简单地通过用户下的 UID 获取用户,而不必拉下整个用户节点?

标签: javascript firebase firebase-realtime-database


【解决方案1】:

由于您的用户名位于嵌套在已知路径下的属性中,因此您可以像这样查询它:

firebase.child("Users")
   .orderByChild("meta/username")
   .equalTo('testName')

【讨论】:

  • 澄清一下,这只会拉下带有 testName 的用户(我知道这是我返回的响应),但它不会使用其他值进行快照然后过滤。不确定 orderByChild 到底是如何工作的。来自文档-Any node which does not have the child key we're querying on is sorted with a value of null-因此,如果有一千个用户并且对于所有具有 testName 的非用户来说它都为 null,那么需要更少的数据来拥有一个我可以直接提取的单独结构并且只有 1 个选项- const快照 = 等待 firebase.child("UsersList").child("testName").on("value")
  • 如果您将按username 分组的用户存储为键,您可以通过直接查找而不用查询来读取所有用户的用户名。数据传输方面,两者之间没有区别(只要您声明了.indexOn)。但是展开的数据结构可以更好地扩展,因为数据库不必查询长列表来查找具有该名称的用户。因此,您需要牺牲一些编码便利性(以及可能的数据重复)以获得更好的可扩展性,这是使用 NoSQL 数据库时的常见权衡。
猜你喜欢
  • 2019-03-23
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
相关资源
最近更新 更多