Firestore - 是否可以通过数组不包含来查询?

20
我知道在数组中查询不存在的值将会非常困难,但有没有一种方法可以不这样做而实现呢?
以下是我的情况:我有一个订阅服务,用户可以选择关注特定的艺术家。在我的后端,这将创建一个订阅文档,其中包含他们的关注者ID、他们想要关注的艺术家的ID(称为artistId)以及一个名为pushed的数组。艺术家可以添加新作品,并在未来通知每个关注者播放特定的歌曲。我希望跟踪已经被推送到哪些关注者,并在前述的pushed数组中进行。我需要一种方法来查找哪些关注者已经被推送了一个特定的作品。
我考虑了合并两个查询,但我不确定是否可能。类似于:
1. db.collection('subscriptions').where('artistId', '==', artistId) 2. db.collection('subscriptions').where('artistId', '==', artistId).where('pushed', 'array-contains', releaseId)
然后取两个查询结果的交集并从第一个查询结果中减去以获取还没有被推送特定作品的关注者。
这种方法可行吗?或者有更好的方法吗?
4个回答

5

无法查询Firestore中没有某个字段或值的文档。这不是“非常困难”,而是根本不可能。要了解更多信息,请参见:

你的解决方法可行,技术上并不复杂。唯一需要记住的是,你需要加载所有的艺术家信息。因此性能将与你拥有的艺术家数量成正比。这在目前可能对你的应用来说还可以接受,但一定要进行一些测量。
通常我的解决方法是追踪向用户推送的最后时间,而不是推送了哪些发行版。假设每个发行版都有一个“通知发送时间戳”,每个用户都有一个“上次收到通知时间戳”。通过比较两者,你可以查询尚未收到关于特定发行版通知的用户。
这种情况下的确切数据模型取决于你的具体用例,你可能需要为每个用户(例如每个他们关注的艺术家)跟踪多个时间戳。但我发现,通常我可以根据这个模型提出一个合理的解决方案。

我发现这个链接:https://firebase.google.com/docs/reference/rules/rules.List 可能是解决这个问题的可行方案。但是,在查询中是否可以使用 Y 操作符中的 X,还是必须先从数据库中读取文档? - nolbuzanis
该链接描述了安全规则中的一种操作,用于检测列表是否包含某个特定值。在SDK中的等效操作符是array-contains - Frank van Puffelen

2
citiesRef.where('country', 'not-in', [['USA']]);

注意双重数组[['USA']]。您需要这样做来过滤掉在'country'数组中有'USA'的任何文档。
单一数组['USA']假定'country'是一个字符串。

4
如果数组只包含“USA”,那么它可以工作。但是这并不实用,因为数组通常包含多个值。 - LacOniC
在大多数情况下,这是没有用的。但是我曾经使用过这个功能来获取不包含用户ID在userId数组中的文档。幸运的是,在这种情况下,用户正在寻找加入另一个用户的游戏(并且数组中只有一个用户),我不想包括当前用户可能已经开始寻找伙伴的游戏的文档。 - BrianG7

2

7
它检查的是正常字段,而不是数组。所以不同。 - LacOniC

1
对于Elasticsearch案例,您需要与数据库和Elasticsearch服务器同步。还需要在Google Cloud Platform上制定防火墙规则,以避免任意请求到达您的服务器,因为这可能会导致带宽费用。

这并没有回答问题。一旦你拥有足够的声望,你就可以对任何帖子进行评论; 相反,提供不需要询问者澄清的答案。- 来自审阅 - Kamil Naja
1
@KamilNaja 这在技术上算是一个答案。它可能是一个质量较低的答案,但至少在LQP审核队列中不应该被删除。 - 10 Rep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接