我知道 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
*/
我需要組合這些查詢( get 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);
}
有沒有辦法解決這個問題?如果我仍然在客戶端合并結果,我的分頁游標將不正確。因此,我需要以某種方式級聯查詢,但我找不到正確的方法。
提前感謝您的任何提示!
uj5u.com熱心網友回復:
我需要組合這些查詢( get
items,其中provider_idORcompany_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.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/336921.html
標籤:javascript 火力基地 google-cloud-firestore pagination
