如何在不先创建索引的情况下查询变量字段并应用排序?

2024-03-28

编辑:我简化了问题和示例,因为这个问题仅 一旦您开始使用即适用orderBy.

我有一个用户集合,其中每个用户都订阅了许多变量,如下所示:

user {
    var1: true,
    var2: true,
    var2: true,
    metric: 10
}

我这样做是因为我需要查询类似的内容:

async function getUsersForVar(varId) {
  const snapshot = await db.collection('users')
    .where(varId, '==', true)
    .get()
  ...
}

这工作得很好,直到我需要根据指标选择一组用户:

async function getTopUsersForVar(varId) {
  const snapshot = await db.collection('users')
    .where(varId, '==', true)
    .orderBy('metric')
    .limit(100)
    .get()
  ...
}

当您执行此操作时,Firestore 会告诉您它需要创建一个特定于所使用的 varId 和指标的索引。但由于项目是可变的,我无法预先知道或索引每个组合。

This document https://firebase.google.com/docs/firestore/solutions/arrays描述了如何对属性进行编码以排序为键值,但对我来说这不是一个选项,因为指标会随着时间的推移而变化。

这是不可能的吗?

也许如果指标发生变化,期望数据库能够有效地执行这样的查询就太过分了。

查询返回的用户文档数量将达到数千。我可以采取什么措施来防止在客户端查询所有数据和排序?

AFAIK Firestore 将为每个查询获取完整文档。该查询将每分钟执行多次,因此如果每次执行该查询时都获取数千个用户文档,则会产生大量开销。

如果没有其他方法,我可能应该将用户的所有相关数据隔离到单独的模型/根集合中,这样就不会获取所有其他用户数据来进行此选择。

使用 Firebase 实时数据库时这会有什么不同吗?


所以这是交易:

如果您想对单个字段进行查询(不等或相等),则不需要索引。 (即使该字段是地图字段中的属性,就像您的顶部示例一样。)

如果你想跨多个字段进行相等查询,那么你也不需要自定义索引。

如果您想要执行的查询包含 1 个或多个等式搜索,后跟不同字段上的不等式搜索或“排序依据”,那么您确实需要自定义索引。目前,同一数据库上只能使用 125 个不同的自定义索引。

因此,考虑到这一点,我不确定您是否可以在不为每个查询创建自定义索引的情况下准确执行您正在寻找的查询类型。

一种解决方法是运行查询而不对结果进行排序,然后在客户端上对它们进行排序。

或者正如 nshmura 建议的那样,您可以尝试的另一种解决方法是将“指标”值添加到您正在查询的变量中。因此,不要像这样构建数据:

user {
    var1: true,
    var2: true,
    var3: true,
    metric: 10
}

您可能会考虑将数据结构化为:

user {
    var1: 10,
    var2: 10,
    var3: 10,
    metric: 10
}

然后你可以执行类似的搜索

 const snapshot = await db.collection('users')
    .where(varId, '>', 0)
    .limit(100)
    .get()

它将自动按该值排序。这是否真的有效可能很大程度上取决于您的具体用例。

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

如何在不先创建索引的情况下查询变量字段并应用排序? 的相关文章

随机推荐

  • FB.event.subscribe comment.create 无需用户操作即可执行操作[重复]

    这个问题在这里已经有答案了 好的 这就是我的问题 我试图在 Facebook 评论中发表评论后向个别帖子的作者发送一封电子邮件 以通知作者已发表评论 评论框位于 K2 项目中 在 Joomla 中 FB event subscribe co
  • stackwalker加载所有符号文件,但仍然没有符号化任何东西

    我可能做错了什么 但我无法弄清楚这一点 我有一个在 Windows 上生成的简单崩溃小型转储 如果我在 Visual Studio 中打开转储 它会毫无问题地加载并显示崩溃线 但我无法让它在 minidump stackwalker 中进行
  • Java 是否保证当前同步的对象不会被垃圾回收?

    当线程持有其监视器时 是否可以保证对象不会被垃圾收集 e g class x private WeakReference r Object getMonitorObject Object o new Object r new WeakRef
  • 如何通过添加像素跟踪来跟踪各个收件人的阅读状态

    我正在构建一个电子邮件应用程序 其功能是在发送电子邮件后查看已读收件人 例如 如果我向 P1 发送了一封电子邮件并抄送 P2 和 P3 那么当 P1 打开电子邮件时 我作为发件人应该能够看到 P1 阅读了他们的电子邮件 为了实现这一目标 我
  • Firebase DB HTTP API 身份验证:何时以及如何刷新 JWT 令牌?

    我正在尝试使用 HTTP API 将 Python Web 应用程序写入 Firebase DB 我正在使用 Google I O 2016 上推出的新版本 Firebase 到目前为止 我的理解是 我想要完成的特定类型的写入是通过对此类型
  • MySQL字段类型如何转换?

    我已经遇到过转换函数 据我了解 基本语法是 select convert columnName targetFieldType as newColumnName from table 运行此命令不会给我任何错误 但是当我检查数据类型时它们没
  • WebGL 渲染抗锯齿

    我正在使用 webgl 和 javascript 有没有一种方法可以在不使用抗锯齿的情况下进行渲染 我需要每个像素都是纯色的 我当前的片段着色器非常简单 precision mediump float varying highp vec3
  • flutter 中出现无效的互联网地址错误

    我将图像上传到 Firebase Storage 然后获取图像的 Url 到 Firebase Storage 创建的图像链接 然后我将图像的 url 保存在 Firestore Documents 中 如果消息有图像并且当我想显示消息时
  • 您如何解释查询的解释计划?

    当尝试了解 SQL 语句如何执行时 有时建议查看解释计划 在解释 理解 解释计划时应该经历什么过程 什么应该脱颖而出 哦 这工作得很好 与 哦 不 那是不对的 每当我看到关于全表扫描不好而索引访问很好的评论时 我都会感到不寒而栗 全表扫描
  • __builtin_trap:什么时候使用它?

    gcc 提供了额外的内置函数 用于优化 其中之一是void builtin trap void 本质上是通过执行非法命令来中止程序 来自文档 builtin trap函数导致程序异常退出 GCC 实现了这个 通过使用目标相关机制 例如有意
  • SoundCloud API:audiomanager.js 上的 setVolume

    我们在使用 SoundCloud Javascript API 时遇到了 setVolume 函数的问题 踪迹 未捕获的 IndexSizeError 索引或大小为负数 或大于允许的值 音频管理器 js 2 HTML5AudioPlayer
  • SLURM:如何限制CPU作业数量以避免浪费GPU资源

    我们使用 SLRUM 在节点之间共享 CPU 和 GPU 资源 有时 GPU 作业无法提交 因为有人提交了满的 CPU 作业 这样的话 就浪费了GPU资源 我该如何制定政策来避免这种冲突 例如 是否可以限制 GPU 作业节点上的最大 CPU
  • 如何修复“compilerVersion”IIS 错误?

    我收到这个异常 System Configuration ConfigurationErrorsException 的值 提供程序选项中的 compilerVersion 属性必须是 v4 0 或 如果您正在编译 4 0 或更高版本的 NE
  • JMS/消息队列的实际使用? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我刚刚阅读了一些有关 JMS 和 Apache ActiveMQ 的内容 想知道这里的人们使用 JMS 或类似的消息队列技术在现实世界
  • 调用可以抛出错误,但错误不能从全局变量初始值设定项中抛出

    我正在使用 Xcode 7 beta 迁移到 Swift 2 后 我遇到了这行代码的一些问题 let recorder AVAudioRecorder URL soundFileURL settings recordSettings as
  • WordPress 重写仅向页面添加基本前缀

    我在尝试完成一个项目时遇到了一个问题 我将当前的永久链接结构设置为 postname 我创建了自己的函数 只为帖子提供前缀 因此我的帖子被重写为 prefix postname 我的问题是我想更改的永久链接pages正如我对帖子所做的那样
  • 在哪里可以找到 libsystem_c.dylib 的源代码?

    我的堆栈跟踪中有一行奇怪的行 我想进一步调查 12 libsystem c dylib 0x3aa272dc free 168 如果我理解正确的话 libsystem c 是 C 标准库 iOS使用的版本是开源的吗 我在哪里可以获得该来源
  • 使用 nodemailer 发送邮件 - 来自字段的电子邮件不正确

    尝试使用 nodemailer 设置联系表单 这是我的 app js 中的内容 EMail configuration var smtpTransport nodemailer createTransport SMTP service Gm
  • 具有自定义类的多维数组

    我正在寻找一个数组声明 初始化和访问数组 该数组将具有 表 数组 及其行 将如下所示 CusomClass1Instance Number CusomClass2Instance CusomClass1Instance Number Cus
  • 如何在不先创建索引的情况下查询变量字段并应用排序?

    编辑 我简化了问题和示例 因为这个问题仅 一旦您开始使用即适用orderBy 我有一个用户集合 其中每个用户都订阅了许多变量 如下所示 user var1 true var2 true var2 true metric 10 我这样做是因为