firebase - 如何在 Firebase firestore 中使用 orderBy 子句查询文档中的两个对象

标签 firebase firebase-realtime-database google-cloud-firestore

我有一个文档结构如下的集合:

{
    departments: {
        dept1: true,
        dept2: true
    },
    roles: {
        role1: true,
        role2: true
    },
    created_at: timestamp
}

如何查询上述集合以获取按时间戳排序的包含 dept1 和 role1 的所有文档。

我在这里检查了 firebase 文档 https://firebase.google.com/docs/firestore/solutions/arrays

但它只回答了当我们查询文档中的单个对象时如何获得有序结果。

此外,如果此文档结构不可能,那么我应该如何构建文档/集合才能以高性能方式获得所需的结果,因为这将是应用程序中最常见的查询

提前致谢。

最佳答案

如果您在 Firebase 控制台中创建索引,您绝对可以进行下面的查询。

this.refCollection.where('departaments.dept1', '==',true).where('roles.role1', '==', true).orderBy('timestamp')

但是,这种方法在您的情况下不起作用,因为您想要动态地将数据添加到数据库中,因此每次创建新部门或角色时都创建新索引是不切实际的添加。解决方案是对数据库进行非规范化。

您可以按照此示例并根据您的情况进行调整:

首先为每个添加的部门创建一个字段,如下所示。

dept1_role1_timestamp: 1514925588675

您的文档将如下所示:

enter image description here

然后创建一个像这样的方法,通过参数传递要从数据库获取的部门和角色。

getDocumentsByDepartamentAndRole(dept, role) {
    return this.collectionRef.orderBy(`${dept}_${role}_timestamp`).get();
}

现在您将能够动态搜索,而无需为添加的每个新部门创建索引。通常,当我们需要保证更好的读取性能时,我们会对数据库进行非规范化。但请记住,您的写入会降低性能,因为每次您想要更新部门的角色时,您都必须更新为使查询成为可能而创建的额外字段。 另一个解决方案是在客户端对数组进行排序。两种方法都可以。

默认情况下,Firestore 不需要为仅使用相等子句的查询添加额外索引,显然这不是您的情况,因为您正在使用范围子句。

要了解有关 Firestore 索引如何工作的更多信息,您可以阅读 documentation .

关于firebase - 如何在 Firebase firestore 中使用 orderBy 子句查询文档中的两个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48048381/

相关文章:

swift - 明天如何将 NSDate 存储到 Firebase 中?

javascript - 类型错误 : Cannot read property 'signInWithPhoneNumber' of undefined

java - 从firebase实时数据库读取数据

java - 如何同时删除实时数据库中的用户身份验证和用户帐户?

android - 读取 Firebase 数据,永远不会调用 onDataChange

firebase - Firestore 的复杂数据模型

java - 在应用 order by 之前操作 Firebase 文档字段中存储的值

javascript - 如何更正在 firebase 实时规则上添加索引

firebase - 无法让StreamBuilder显示来自Cloud Firestore的数据

angular - Firebase 单独的 firebase.json 文件用于测试和生产 - 使用 Angular 环境文件变量?