在这个问题Firebase Firestore - OR query中,他们说没有OR查询。这意味着我不能轻松地查询具有我之前获取到的ID数组的项。
// What I want
documentRef
.whereField("itemId", isEqualTo: "id1")
.orWhereField("itemId", isEqualTo: "id3")
// or
documentRef
.whereField("itemId", in: idArray)
由于这种方式不起作用,查询数据有哪些更好的选项呢?
- 获取所有数据并在本地检查
我可以获取所有记录并在设备上检查ID,但问题在于它可能多达1000条记录,而用户可能只需要其中的三条。
- 对所有项目进行单独的查询
我可以为用户需要的每个项目执行查询whereField("itemId", isEqualTo: "id")
。如果用户只需要几个项目,那么这将是一个很好的选择,但是如果用户需要所有项目,这个解决方案将比第一个解决方案慢得多。(除非您可以批量读取)
- 移动数据
我认为我可以将已购买的数据移动到Item集合中:Items/itemid/PurchasedBy/uid
,但我想检索用户购买的Item,并且我不知道如何查询嵌套集合内的字段。我也不知道这是否是数据的正确位置。
我的数据:
Users/uid/PurchasedItems/itemid
payedInMoney: "$0.00"
payedInCoins: "100"
itemId: "itemid"
timeStamp: timestamp
Items/itemid
itemId: "itemid"
// Other item info
编辑:
我选择了第一种方法,因为这是我在RTDB上的做法,但即使启用持久性并使用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:
决定继续使用RTDB,直到Firestore上的持久性真正起作用。
编辑3:
被接受的答案解决了这个问题,尽管它没有解决我的所有问题,但可能会帮助其他人。
在使用Firestore进行仅一个查询的测试后,结果仍然需要比在RTDB中进行嵌套查询更长时间才能得出,因此我将暂时坚持我的决定。