firebase - Firestore - 可以通过数组不包含查询吗?
问题描述
我知道很难通过数组中不存在的值进行查询,但是有没有办法做到这一点而不完全这样做?
这是我的场景 - 我有一个基于订阅的服务,人们可以选择加入并“关注”特定的艺术家。在我的后端,这会创建一个订阅文档,其中包含他们的 followerId、他们想要关注的艺术家的 id(称为 artistId)和一个称为 push 的数组。艺术家可以添加新版本,然后在未来向每个关注者发送特定歌曲的通知。我想跟踪哪个追随者被推送了哪个版本,这在前面提到的推送数组中完成。我需要一种方法来查找哪些追随者已经被推送了特定版本,所以......
我正在考虑组合两个查询,但我不确定是否可能。就像是:
db.collection('subscriptions').where('artistId', '==', artistId)
db.collection('subscriptions').where('artistId', '==', artistId).where('pushed', 'array-contains', releaseId)
然后取两个查询结果的交集并从第一个查询中减去,得到尚未推送特定版本的关注者。
这可能吗?或者,还有更好的方法?
解决方案
无法在 Firestore 中查询没有特定字段或值的文档。这不是“非常困难”,但根本不可能。要了解有关原因的更多信息,请参阅:
您的解决方法是可能的,并且在技术上甚至不是很复杂。唯一要记住的是,您需要加载所有艺术家。因此,性能将与您拥有的艺术家数量成线性关系。目前这对您的应用程序来说可能没问题,但肯定需要对它进行一些测量。
通常,我的解决方法不是跟踪推送给用户的版本,而是跟踪最后一次推送发送给用户的时间。假设一个版本有一个“通知发送时间戳”,每个用户都有一个“最后收到的通知时间戳”。通过比较两者,您可以查询尚未收到有关特定版本通知的用户。
确切的数据模型将取决于您的确切用例,并且您可能需要跟踪每个用户的多个时间戳(例如,他们关注的每个艺术家)。但我发现总的来说我可以根据这个模型提出一个合理的解决方案。
推荐阅读
- javascript - 选中时从 javascript 中的逗号分隔字符串中删除数字为假
- c - 如何通过 C 中的 for 循环定义多个整数变量?
- ssh - SSH 密钥转移到另一台机器以连接到 adhoc 服务器?
- c# - 如何从具有 AAD 设置的 asp.net mvc 应用程序调用外部网站
- javascript - 在 JS 对象图中查找节点之间的路径
- python - 在现有的 pandas df 中添加缺少观测值的变量,而不会丢失较大 df 中的观测值
- python - Django:列表索引超出范围
- flutter - 颤振:未为“未来”类定义运算符“[]”
- spring - 由 BeanInstantiationException 引起的 org.springframework.beans.factory.BeanCreationException
- javascript - 如何在 Bootstrap 4 .btn-group-toggle 上显示 JavaScript 验证错误