首页 > 解决方案 > 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);
}

有没有办法解决这个问题?如果我仍然在客户端组合结果,我的分页光标将不正确。因此,我需要以某种方式级联查询,但我找不到正确的方法。

提前感谢您的任何提示!

标签: javascriptfirebasegoogle-cloud-firestorepagination

解决方案


我需要组合这些查询(获取items,其中provider_idOR company_id具有给定值)。

在您的特定情况下(即在同一 items集合中搜索provider_idcompany_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.


推荐阅读