swift - FireStore - 如何绕过数组 "does-not-contain"查询

标签 swift database firebase google-cloud-firestore nosql

经过一些研究,很明显我不能使用 FireStore 来查询给定数组不包含的项目。有没有人对此用例有解决方法?...

用户注册后,应用程序会获取一堆卡片,每张卡片在 FireStore 中都有一个对应的“卡片”文档。用户与卡片交互后,卡片文档将用户的 uid 添加到字段数组中(例如:usersWhoHaveSeenThisCard: [userUID]),“user”文档将卡片的 uid 添加到字段数组中(例如:cardsThisUserHasSeen: [cardUID]) )。 “user”文档位于“user”集合中,“card”文档位于“card”集合中。

目前,我想获取用户未与之交互的所有卡片。但是,这是有问题的,因为我只知道用户与之交互的卡片,因此 .whereField(usersWhoHaveSeenThisCard, arrayContains: currentUserUID) 将不起作用,因为我需要一个不存在的“arrayDoesNotContain”语句。

最后,用户不能拥有卡片,因此我无法在卡片文档中创建真/假 bool 字段(例如: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

最佳答案

正如您从查询限制中发现的那样,单独使用 Cloud Firestore 没有简单的解决方法。您需要以某种方式存储所看到的文档列表,将其加载到客户端应用程序的内存中,然后从所有潜在文档的查询结果中手动减去这些文档。

您可能需要考虑使用另一个可以更干净地执行此类操作的数据库(例如可以执行连接和子查询的 SQL 数据库)来扩充您的应用程序,并并行维护它们。

要么,要么要求以可预测的顺序查看所有文档,例如按时间戳。然后您需要存储的就是最后看到的文档的时间戳,并使用它来过滤结果。

关于swift - FireStore - 如何绕过数组 "does-not-contain"查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57812558/

相关文章:

ios - 找不到 Objective C 桥接头文件

swift - Grand Central Dispatch with Swift : Use of unresolved identifier GCD

java - 带有 null Date 参数的 Hibernate native 查询

javascript - 如何从url中获取参数?

node.js - 如何更改 Firebase 中的正文解析器限制?

firebase - 如何使用 flutter cloud_firestore 包传递 firestore 身份验证 token

ios - 滚动离开屏幕(即不可见)时如何访问 CollectionView header

swift - swift 中这两种类型的类型转换方法有什么区别

mysql - 数据库查询中的锁

mysql - 如何一条一条的选择记录而不重复