在这个问题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确实试图显示某个用户的购买物品,我立即从该物品中获取所有数据,因此当用户点击该物品时我不需要再拨打一个电话。 –