2017-10-18 69 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匹配的苹果 –