2017-10-18 70 views
4

在這個問題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) 

由於這不起作用,有什麼方法可以更好地查詢我的數據?


  1. 獲取所有數據,並在本地檢查

我能得到我的所有記錄,只是檢查設備上的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中執行嵌套查詢需要更長的時間,因此我將堅持現在的決定。

    +0

    你試圖顯示什麼數據?所有由特定用戶購買的物品?你在這個查詢中需要什麼數據/ items/itemid? –

    +0

    @hatboysam確實試圖顯示某個用戶的購買物品,我立即從該物品中獲取所有數據,因此當用戶點擊該物品時我不需要再撥打一個電話。 –

    回答

    1

    這似乎是複製某些項目數據的好例子。我假設像「名稱」這樣的項目屬性是不可變的,因此可以存儲在PurchasedItems子集合中,而不必擔心未來的更新。

    所以,如果你的一些數據添加到PurchasedItems

    Users/uid/PurchasedItems/itemid 
    
        // Existing 
        payedInMoney: "$0.00" 
        payedInCoins: "100" 
        itemId: "itemid" 
        timeStamp: timestamp 
    
        // Add these 
        name: "Item Name" 
        url: "http://foo.bar/123" 
    

    然後,你將有足夠的信息顯示在一個單一的查詢用戶的購買物品的清單,而無需通過也要看各個項目ID。

    +0

    這將適用於我的問題,所以我會接受它作爲答案,但在我的情況下,我有三種方式購買物品:通過應用程序(payedInCoins),通過網站(payedInMoney)和通過Apples購買應用程序。這些iaps不會保存在我的最後,所以我不能只添加一個名稱字段,我仍然需要遍歷所有的項目以找到與iapid匹配的蘋果 –