Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift Firebase Firestore-或查询替代方案_Swift_Firebase_Google Cloud Firestore - Fatal编程技术网

Swift Firebase Firestore-或查询替代方案

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) 既然这不起作用,那么什么选项更适合查询我的数据 获取所有数

在这个问题上,他们说没有任何疑问。这意味着我无法轻松查询具有我之前获得的数组中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”)
    。如果用户只需要少数项目,这将是一件好事,但用户可能需要所有项目,并且此解决方案将比第一个解决方案慢得多。(除非您可以批量读取)


  • 移动数据
  • 我想我可以将购买的数据移动到项目集合:
    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))
    }