在這個問題Firebase Firestore - OR query他們說沒有OR查詢。這意味着我不能輕鬆地查詢具有我之前獲得的數組中ID的項目。Firebase Firestore - 或查詢替代
// What I want
documentRef
.whereField("itemId", isEqualTo: "id1")
.orWhereField("itemId", isEqualTo: "id3")
// or
documentRef
.whereField("itemId", in: idArray)
由於這不起作用,有什麼方法可以更好地查詢我的數據?
- 獲取所有數據,並在本地檢查
我能得到我的所有記錄,只是檢查設備上的ID,但問題是,它可以達到1000條記錄與用戶可能只需要其中的三個。
- 做單獨的查詢所有項目
- 移動數據
我可以做一個查詢whereField("itemId", isEqualTo: "id")
每個項目的用戶需求。如果用戶只需要一些項目,但這可能會很好,但用戶可能需要所有項目,並且此解決方案會比第一個項目慢得多。 (除非你可以批量讀取)
我想我可以在購買的數據移動到項目集合:Items/itemid/PurchasedBy/uid
,但我想要檢索用戶已購買的項目,我不知道如何通過嵌套集合中的字段查詢項目。我也不知道這是否是數據的正確位置。
我的數據:
Users/uid/PurchasedItems/itemid
payedInMoney: "$0.00"
payedInCoins: "100"
itemId: "itemid"
timeStamp: timestamp
Items/itemid
itemId: "itemid"
// Other item info
編輯:
我做的第一個選項,因爲這是我做這件事是實時數據庫,但即使與持久性和使用addSnapshotListener
公司的FireStore沒有按甚至沒有接近RTDB實施的速度。我記錄了時間,看起來Firestore至少是RTDB的4倍(都啓用了持久性)。
// iPad 5 (2017) - iOS 11
RTDB: 50-100ms
FST: 350-450ms
// iPad Air (2014) - iOS 10
RTDB: 100-150ms
FST: 700-850ms
// iPad Mini (2012) - iOS 9
RTDB: 150-200ms
FST: 2900-3200ms
編輯2:
決定與實時數據庫堅持,直到公司的FireStore持久性確實有效。
編輯3:
接受的答案能解決問題的這個問題,儘管它不能解決所有煤礦,它可能會幫助別人。
在使用Firestore僅使用一個查詢進行測試之後,結果仍然比在RTDB中執行嵌套查詢需要更長的時間,因此我將堅持現在的決定。
你試圖顯示什麼數據?所有由特定用戶購買的物品?你在這個查詢中需要什麼數據/ items/itemid? –
@hatboysam確實試圖顯示某個用戶的購買物品,我立即從該物品中獲取所有數據,因此當用戶點擊該物品時我不需要再撥打一個電話。 –