Firebase Firestore:使用逻辑或和分页进行查询

Firebase Firestore: Query with logical OR and pagination

我知道 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);
}

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

提前感谢您的任何提示!

I need to combine these queries (get items, where provider_id OR company_id has a given value).

在您的特定情况下(即搜索 same 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 returns a Query.