Firebase 实时数据库:如何在键值对上正确建立索引

2024-01-26

Question

我有这个 Firebase 实时数据库:

{      
  "groupUsers" : {
    "group1key" : {
      "user1key" : "admin"
    },
    "group2key" : {
      "user1key" : "admin",
      "user2key" : "readonly",
      "user3key" : "readwrite"
    }
  }
}

在我的 Android 应用程序中,我像这样查询

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("groupUsers");
ref.orderByChild(auth.getCurrentUser().getUid()).startAt("").addValueEventListener() {...}

这会产生警告:

使用未指定的索引。考虑将“.indexOn”...添加到您的安全和 Firebase 数据库规则中以获得更好的性能

如何正确索引?当数据增长时,我担心我的应用程序对未索引数据的查询会变得非常慢。

背景

我已经尝试在我的规则文件中对值进行索引:

".indexOn": ".value"

但这仅当数据是标量但它们是键值对时才有效("user1key" : "admin").

我不能像这样在规则文件中添加索引:

".indexOn": ["user"]

因为这需要一个常量属性名称,如下所示:

{ "groupUsers" : {
    "group1key" : {
      "name" : "user1"
    }        
  }
}

但我有像名字一样的价值观

"user1key" : "admin",
"user2key" : "readonly",
"user3key" : "readwrite"

无法为这种结构预先创建索引。我在我的回答中介绍了这种类型的结构here http://stackoverflow.com/questions/40656589/firebase-query-if-child-of-child-contains-a-value and here https://stackoverflow.com/questions/41527058/many-to-many-relationship-in-firebase新的 Firestore 文档(在这方面的工作原理类似)甚至有一个关于它的文档页面 https://firebase.google.com/docs/firestore/solutions/arrays.

建议以允许在另一个方向进行查找的方式存储数据。使用当前的结构,您可以有效地查找组中的用户。为了还允许查找用户的组,请添加以下结构:

{      
  "usersGroups" : {
    "user1key" : {
      "group1key" : "admin",
      "group2key" : "admin"
    },
    "user2key" : {
      "group2key" : "readonly",
    },
    "user3key" : {
      "group2key" : "readwrite"
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firebase 实时数据库:如何在键值对上正确建立索引 的相关文章

  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 我想实现下面的布局,按钮应该在屏幕底部,当惰性列被填充时,按钮不应该出去

    顶部有惰性列 惰性列下方有输入电话号码布局并从电话簿布局添加联系人 我希望当未添加联系人时此布局位于顶部 当我添加大量联系人时输入电话号码并添加电话簿布局中的联系人会随着惰性列滚动并移出屏幕 我不让他们走出屏幕 当接触较多时 它们必须粘在底
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 我的设备突然没有显示在“Android 设备选择器”中

    我正在使用我的三星 Galaxy3 设备来测试过去两个月的应用程序 它运行良好 但从今天早上开始 当我将设备连接到系统时 它突然没有显示在 Android 设备选择器 窗口中 我检查过 USB 调试模式仅在我的设备中处于选中状态 谁能猜出问
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • GitHub Actions:如何将 toJSON() 结果传递给 shell 命令

    因此 我正在与 Github Actions 合作进行端到端测试 我正在查看的设置是让一项作业检索要测试的 url 列表 而我的第二项作业使用该列表创建一个矩阵并测试所有这些 我的问题是 当我实际运行测试脚本时 必须从命令行完成 因为我使用
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 一次显示两条Toast消息?

    我希望在一个位置显示一条 Toast 消息 并在另一位置同时显示另一条 Toast 消息 多个 Toast 消息似乎总是按顺序排队和显示 是否可以同时显示两条消息 是否有一种解决方法至少可以提供这种外观并且不涉及扰乱活动布局 Edit 看来
  • android sdk 的位置尚未在 Windows 操作系统的首选项中设置

    在 Eclipse 上 我转到 windows gt Android SDK 和 AVD Manager 然后弹出此消息 Android sdk 的位置尚未在首选项中设置 进入首选项 在侧边栏找到 Android 然后会出现一个 SDK 位
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • 强制 Listview 不重复使用视图(复选框)

    我做了一个定制Listview 没有覆盖getView 方法 Listview 中的每个项目都具有以下布局 联系布局 xml

随机推荐

  • 如何使用 Windows 任务计划程序自动执行 PowerShell 脚本?

    我有一个发送电子邮件的 PowerShell 脚本 我想每 1 分钟自动执行一次该脚本 我该如何使用任务计划程序来做到这一点 目前我已经创建了一个任务并提供了脚本的路径 但是该调度程序打开我的脚本 而不是执行 我使用的是 Windows 7
  • JDK8 是 JBoss 6 AS 支持的平台吗

    我们正在将应用程序 java 平台升级到最新的稳定平台 并且我们正在使用 Jboss 6 AS Is 甲骨文JDK8JBoss 6 AS 支持的平台 不 它不会起作用 JBoss AS 6和 7 不兼容Oracle JDK 1 8 您需要下
  • 阻止 GSON 序列化 JSON 字符串

    我是 gson 的新手 并且有一个尚未找到答案的新手问题 所以请耐心等待 StackOverflow 和 google 不是我的朋友 我有一个 java 类 User 其属性之一 externalProfile 是一个包含已序列化 JSON
  • 为什么 MFunctor 的“hoist”没有“Monad n”约束?

    我有一个协程变压器 data Step y m a Done a Yield y CoT y m a data CoT y m a CoT m Step y m a with Monad实例 unCoT CoT y m a gt m Ste
  • Laravel - 针对不同用户使用唯一参数重复输入

    使用 Laravel 5 2 我正在 Laravel 中开发一个电话簿项目 您将联系信息存储在名为的表中Contacts 要在此表中创建新联系人 您必须注册 并且您的信息将记录在users table 我创建了一个视图来显示Contacts
  • Firemonkey T编辑高度

    我正在使用 Delphi Seattle 我的应用程序适用于 Windows 桌面 我正在尝试更改 TEdit 的字体大小 因此高度也被修改 在设计时一切正常 但当我运行应用程序时 TEdit 会忽略高度修改并剪切文本 我试图找到Fixed
  • NEWSEQUENTIALID 的可预测性如何?

    根据微软的文档NEWSEQUENTIALID http msdn microsoft com en us library ms189786 aspx NEWSEQUENTIALID 的输出是可预测的 但可预测性如何呢 假设我有一个 GUID
  • sed 中的反向引用返回错误值

    我正在尝试使用 sed 替换表达式 正则表达式在 vim 中有效 但在 sed 中无效 我用斜杠替换数字前的最后一个破折号 所以 www file name 1 应该返回 www file name 1 我正在使用以下命令 但它一直输出 w
  • Apache Camel HTTP 显示请求和响应

    我正在使用 Apache Camel 将数据从 CSV 文件加载到 Web 服务 无论如何我可以显示请求和响应 下面是路由配置 我从数组中拆分并聚合 100 个项目 以作为 POST 正文发送 from fileLocation unmar
  • SqlAlchemy TIMESTAMP“更新时”额外

    我在 python3 4 3 上使用 SqlAlchemy 来管理 MySQL 数据库 我正在创建一个表 from datetime import datetime from sqlalchemy import Column text cr
  • 今日小部件扩展高度 - iOS10

    今日小部件视图模式的高度无法设置为紧凑模式 无论我设置什么值 它将小部件的高度设置为默认值 扩展模式工作完美 并且值已正确设置并反映在小部件中 我已经在 viewDidLoad 方法中添加了这一行 self extensionContext
  • 生产中使用 Flask-oauthlib 或 authlib?

    我刚刚在我正在构建的网站上使用了flask oauthlib 但是 我注意到该项目的首页有一个警告 要求改为使用 authlib 如果您在生产中使用flask oauthlib 您是否计划迁移到authlib 有谁知道一个完成此迁移的简单项
  • 流式源的查询必须使用 writeStream.start() 执行;

    我正在尝试在 Spark 中读取来自 kafka 版本 10 的消息并尝试打印它 import spark implicits val spark SparkSession builder appName StructuredNetwork
  • 对于 Android 4.4 及以上版本,使用 Crosswalk 有什么真正的好处吗?

    Crosswalk 插件对于为混合应用带来巨大的性能提升非常重要 但问题是 一旦添加 APK 就会变得巨大 给安装程序增加了大约 15 18MB 的大小 那么 将人行横道添加到 Android 4 4 及更高版本的安装程序中是否有任何真正的
  • 类实例实现,初始化实例 - 来自 SICP python

    我试图理解Python类系统实现中的初始化函数 摘自本书 SICP python 参考书籍部分 http www inst eecs berkeley edu cs61a sp12 book objects html instances T
  • 指向常量的指针

    众所周知 通过引用将参数 特别是像结构体一样大的参数 传递给函数是一种很好的做法 为了应用 最小特权 原则 如果该函数不应该更改这些传递变量的值 那么我们需要将它们的引用作为指向常量的指针传递 我的问题是 作为指向常量的指针传递不能防止更改
  • 如何以编程方式绑定 NSCollectionView 的视图子类?

    我已经成功创建了一个 NSCollectionView 并向 IB 中的视图原型添加了一个标签 绑定到我所表示的对象的属性 我现在想以编程方式创建一个 NSButton 和 NSTextField 并将 NSTextField 绑定到我所表
  • 如何忽略 functools 中的参数。 lru_缓存?

    这是我想要通过缓存增强的功能的框架 因为进行 RPC 远程过程调用 涉及到其他主机的 TCP 连接 def rpc rpc server rpc func arg return rpc server do rpc rpc func arg
  • iOS 8.3 - 元视口初始比例低于 1.0 会导致方向变化时出现奇怪的内容缩放

    将我的 iOS 设备升级到 iOS 8 3 后 我注意到元视口初始缩放属性出现了一些奇怪的行为 如果我将初始比例设置为 1 0 以下 并在浏览网页时旋转设备 则整个内容将逐渐变小 最终浏览器将崩溃 我注意到 每次方向变化时内容变小的程度与您
  • Firebase 实时数据库:如何在键值对上正确建立索引

    Question 我有这个 Firebase 实时数据库 groupUsers group1key user1key admin group2key user1key admin user2key readonly user3key rea