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_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
returns a Query
.
我知道 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
, whereprovider_id
ORcompany_id
has a given value).
在您的特定情况下(即搜索 same 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
returns a Query
.