Swift Firebase Firestore-或查询替代方案
在这个问题上,他们说没有任何疑问。这意味着我无法轻松查询具有我之前获得的数组中ID的项Swift Firebase Firestore-或查询替代方案,swift,firebase,google-cloud-firestore,Swift,Firebase,Google Cloud Firestore,在这个问题上,他们说没有任何疑问。这意味着我无法轻松查询具有我之前获得的数组中ID的项 // What I want documentRef .whereField("itemId", isEqualTo: "id1") .orWhereField("itemId", isEqualTo: "id3") // or documentRef .whereField("itemId", in: idArray) 既然这不起作用,那么什么选项更适合查询我的数据 获取所有数
// What I want
documentRef
.whereField("itemId", isEqualTo: "id1")
.orWhereField("itemId", isEqualTo: "id3")
// or
documentRef
.whereField("itemId", in: idArray)
既然这不起作用,那么什么选项更适合查询我的数据
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
编辑: 我之所以选择第一个选项,是因为我在RTDB上就是这样做的,但即使启用了持久性并使用
addSnapshotListener
Firestore,其速度也远不及RTDB实现的速度。我记录了时间,看起来Firestore的速度至少是RTDB的4倍(都启用了持久性)
编辑2:
决定坚持使用RTDB,直到Firestore上的持久性真正起作用
编辑3:
被接受的答案解决了这个问题,即使它不能解决我所有的问题,它可能会帮助其他人
在使用Firestore仅使用一个查询进行测试后,结果仍然比在RTDB中执行嵌套查询需要更长的时间,因此我现在将坚持我的决定。这似乎是复制某些项目数据的好例子。我假设某些项属性(如“name”)是不可变的,因此可以存储在
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查找每个物品。您可以使用rxjs组合观察值
orQuery(){
const $one = this.afs.collection("items", ref => ref.where("itemId","==","1")).valueChanges();
const $two = this.afs.collection("items", ref => ref.where("itemId","==","3")).valueChanges();
return combineLatest($one,$two).pipe(
map(([one, two]) => [...one, ...two])
)
}
getOr(){
this.orQuery().subscribe(data => console.log(data))
}
您试图显示的数据是什么?指定用户购买的所有项目?在这个查询中,您需要/items/itemid中的哪些数据?@hatboysam确实试图显示用户购买的物品,我一次从项目中获取所有数据,因此当用户单击项目时,我不需要再打电话。这对我的问题有效,因此我会接受它作为答案,但在我的情况下,我有三种购买项目的方式:通过应用程序(payedInCoins)、通过网站(payedInMoney)和通过苹果应用程序内购买。这些IAP并没有保存在我的终端上,所以我不能只添加一个名称字段,我仍然需要遍历我的所有项目,以找到与iapid匹配的项目
orQuery(){
const $one = this.afs.collection("items", ref => ref.where("itemId","==","1")).valueChanges();
const $two = this.afs.collection("items", ref => ref.where("itemId","==","3")).valueChanges();
return combineLatest($one,$two).pipe(
map(([one, two]) => [...one, ...two])
)
}
getOr(){
this.orQuery().subscribe(data => console.log(data))
}