javascript - Firebase Firestore:使用逻辑 OR 和分页进行查询
问题描述
我知道 Firestore 查询中没有真正的逻辑“或”。这就是为什么我通常会做两个单独的查询并在客户端合并结果。
但是我现在需要添加分页。对于分页,在客户端合并来自 Firestore 的结果显然不会起作用。
编辑:关于我的数据库方案的更多信息:
// Collection: 'items'
doc-id-1
provider_id: 'ABCDE'
company_id: 'FGHIJ'
doc-id-2
provider_id: 'KLMNO'
company_id: 'ABCDE'
doc-id-3
provider_id: 'ABCDE'
company_id: 'ABCDE'
doc-id-4
provider_id: 'KLMNO'
company_id: 'KLMNO'
这是我的例子:
// Get items by provider
db_query = this.db.collection('items').ref
.where('provider_id', '==', 'ABCDE');
// OR
// Get items by company
db_query = this.db.collection('items').ref
.where('company_id', '==', 'ABCDE');
/*
Combining the queries above with a logical OR should return
the following documents (from my database scheme further up):
- doc-id-1
- doc-id-2
- doc-id-3
*/
我需要组合这些查询(获取items
,其中provider_id
OR company_id
具有给定值)。
我的分页工作如下(Firestore 中的默认方法):
// Query type (init, next page, prev page, fallback)
if (query_type == 'init') {
db_query = db_query.limit(limit);
} else if (query_type == 'next') {
db_query = db_query.startAfter(last_in_response).limit(limit);
} else if (query_type == 'prev') {
db_query = db_query.endBefore(first_in_response).limitToLast(limit);
} else {
db_query = db_query.limit(limit);
}
有没有办法解决这个问题?如果我仍然在客户端组合结果,我的分页光标将不正确。因此,我需要以某种方式级联查询,但我找不到正确的方法。
提前感谢您的任何提示!
解决方案
我需要组合这些查询(获取
items
,其中provider_id
ORcompany_id
具有给定值)。
在您的特定情况下(即在同一 items
集合中搜索provider_id
或company_id
等于相同值的所有文档),您可以对数据进行非规范化,例如,有一个额外provider_company_ids
的数组类型字段,其中包含两个元素。第一个元素将保存 的值,provider_id
第二个元素将保存 的值company_id
。
然后您可以array-contains
按如下方式使用运算符:
db_query = this.db.collection('items').ref
.where("provider_company_ids", "array-contains", "ABCDE");
并且您将能够正确分页,因为它现在是一个查询。
根据您在问题下添加的评论进行更新:
实施上述解决方案后,您的文档将如下所示:
// Collection: 'items'
doc-id-1
provider_id: 'ABCDE'
company_id: 'FGHIJ'
provider_company_ids: ['ABCDE', 'FGHIJ'] // New field of type array
doc-id-2
provider_id: 'KLMNO'
company_id: 'ABCDE'
provider_company_ids: ['KLMNO', 'ABCDE']
doc-id-3
provider_id: 'ABCDE'
company_id: 'ABCDE'
provider_company_ids: ['ABCDE', 'ABCDE']
doc-id-4
provider_id: 'KLMNO'
company_id: 'KLMNO'
provider_company_ids: ['KLMNO', 'KLMNO']
PS:我不确定ref
您的代码(db_query = this.db.collection('items').ref.where('provider_id', '==', 'ABCDE');
)中的属性是什么。我在我的 anwser 中重新使用它,假设this.db.collection('items').ref
返回一个Query
.
推荐阅读
- javascript - 如何使用 IoNIC 从国际电话号码中获取电话本地号码
- azure - Azure 分析服务部署
- amazon-athena - 自定义聚合和计算字段的 Quicksight 问题
- python-3.x - 从 Python Selenium 执行时,按钮单击在 Chrome Webdriver 上的工作不一致(挂起)
- java - 在 Integer 的左边加零
- discord - discordjs如何在没有dms的情况下控制台日志消息
- java - Swing JButton:图标和文本在一个位置
- flutter - 如何在 PopupMenuItem 中使用 onTap 或 onPressed
- regex - Lua - 拆分字符串但允许空值
- r - 使用 R 语言从 XML 数据文件构建表