当前位置: 首页 > 知识库问答 >
问题:

FireStore-如何绕过数组“不包含”查询

袁博
2023-03-14

当前,我想获取用户未与之交互的所有卡片。但是,这是有问题的,因为我只知道用户与之交互过的卡,所以.wherefield(usersWhoHaveSeenThisCard,arraycontains:currentUserUID)将不起作用,因为我需要一个“arraydoesnotcontain”语句,而该语句并不存在。

最后,用户不能拥有卡,所以我不能在卡文档中创建真/假布尔字段(例如:UserHasseEnthisCard:false)并根据该条件进行搜索。

我能想到的唯一解决方案是在卡片文档上创建一个新的字段数组,其中包括每个没有看到卡片的用户(例如:userswhohavenotseenthisCard:[userUID]),但这意味着每个注册的用户都必须将他们的uid写入1000多个卡片文档,这会吃掉我的数据。

我可能只是运气不好,但我希望有一个更了解NOSQL/FireStore的人能提供一些见解。

// If any code sample would help, please let me know and I'll update - I think this is largely conceptual as of now

共有1个答案

冯星剑
2023-03-14

有一个公认的很好的答案,然而,它没有提供一个问题的直接解决方案,所以这里说...(这可能有帮助,也可能没有帮助,但确实有用)

我不知道你的Firestore结构是什么,所以我的假设是:

cards
   card_id_0
      usersWhoHaveSeenThisCard
         0: uid_0
         1: uid_1
         2: uid_2
   card_id_1
      usersWhoHaveSeenThisCard
         0: uid_2
         1: uid_3
   card_id_2
      usersWhoHaveSeenThisCard
         0: uid_1
         1: uid_3

假设我们想知道哪些卡uid_2没有看到--在本例中是card_id_2

func findCardsUserHasNotSeen(uidToCheck: String, completion: @escaping ( ([String]) -> Void ) ) {
    let ref = self.db.collection("cards")

    ref.getDocuments(completion: { snapshot, err in
        if let err = err {
            print(err.localizedDescription)
            return
        }

        guard let docs = snapshot?.documents else {
            print("no docs")
            return
        }
        var documentsIdsThatDoNotContainThisUser = [String]()
        for doc in docs {
            let uidArray = doc.get("usersWhoHaveSeenThisCard") as! [String]
            let x = uidArray.contains(uidToCheck)
            if x == false {
                documentsIdsThatDoNotContainThisUser.append(doc.documentID)
            }
        }
        completion(documentsIdsThatDoNotContainThisUser)
    })
}
func checkUserAction() {
    let uid = "uid_2" //the user id to check
    self.findCardsUserHasNotSeen(uidToCheck: uid, completion: { result in
        if result.count == 0 {
            print("user: \(uid) has seen all cards")
            return
        }
        for docId in result {
            print("user: \(uid) has not seen: \(docId)")
        }
    })
}
user: uid_2 has not seen: card_id_2
 类似资料:
  • 我在集合中有大约30条记录,其中几乎25条包含单词。现在,当我尝试使用时,它不会返回任何东西。 下面是我的查询代码: 下面是我的Firestore截图:

  • 一旦我将类别从数组更改为映射,我想我可以使用多个where条件来过滤文档 现在问题2,firebase要求为复合查询添加索引。我在每个文档中保存的类别是动态的,我无法提前添加这些索引。在这种情况下,理想的解决方案是什么?如有任何帮助,不胜感激。

  • 我在Firestore中收集了一组文档,其中有一个字段是字符串数组,这些是添加到数据中的标记。 用户可以通过在前端选择和取消选择这些标签来过滤数据,所以我正在做一个数组来查询Firestore。 然后,我在最佳匹配上对结果进行评分,因此匹配更多标签的文档被排序到顶部,并显示到页面顶部供用户使用。 我现在正试图用带有文档快照的startAfter作为光标和限制,对这些数据进行分页。但我需要确保,当限

  • 问题内容: 如果我有一个简单的集合,例如: 如果我要搜索含有维生素B6的水果,则可以执行以下操作: 这样一来,我便可以看到我收藏的所有含有维生素A的水果。但是,我如何能够搜索含有多种维生素(例如维生素B6和C)的水果?我不能简单地搜索,因为那样会寻找数组,而不是独立的字符串。 在Cloud Firestore中甚至有可能吗?如果没有,还有其他替代方法吗? 问题答案: 通过在查询中链接条件来寻找匹配

  • 在Cloud Firestore中这甚至是可能的吗?如果没有的话,有没有其他方法可以做到这一点?

  • 我有一个数据结构,由一个名为“民意测验”的集合组成“民意测验”有几个随机生成身份证的文档。在这些文档中,还有一个名为“答案”的额外集合用户对这些民意测验进行投票,投票都写入“答案”子集合。我在“答案”节点上使用. runTransaction()方法,目的是这个子集合(对于任何给定的投票)不断被用户更新和写入。 我一直在阅读关于火力恢复的社交媒体结构。然而,我最近遇到了火力恢复的一个新功能,“ar