Firestore - 可以通过数组不包含进行查询吗?



我知道通过数组中不存在的值进行查询非常困难,但是有没有办法在不这样做的情况下做到这一点?

这是我的场景 - 我有一个基于订阅的服务,人们可以选择加入并"关注"特定的艺术家。在我的后端,这会创建一个订阅文档,其中包含他们的追随者 ID、他们想要关注的艺术家的 ID(称为 artistId(以及一个名为 push 的数组。艺术家可以添加新版本,然后向每个关注者发送将来特定歌曲的通知。我想跟踪哪个关注者被推送了哪个版本,这在前面提到的推送数组中完成。我需要一种方法来查找哪些关注者已经被推送到特定版本,所以......

我正在考虑合并两个查询,但我不确定这是否可能。像这样:

  1. db.collection('subscriptions').where('artistId', '==', artistId)
  2. db.collection('subscriptions').where('artistId', '==', artistId).where('pushed', 'array-contains', releaseId)

然后取两个查询结果的交集,从第一个查询中减去,得到没有推送特定版本的关注者。

这可能吗?还是有更好的方法?

无法向 Firestore 查询没有特定字段或值的文档。这不是"非常困难">,但根本不可能。要了解有关原因的更多信息,请参阅:

  • Firestore 获取值不在数组中的文档?
  • Firestore:如何在不等式/不等于的情况下执行查询
  • 了解
  • 云还原一集,了解 Firestore 查询的工作原理。

您的解决方法是可能的,从技术上讲甚至不是很复杂。唯一要记住的是,您需要加载所有艺术家。因此,性能将与您拥有的艺术家数量成线性关系。目前,这对您的应用程序来说可能很好,但绝对需要对其进行一些测量。

通常,我的解决方法不是跟踪推送给用户的版本,而是跟踪上次推送给用户的时间。假设一个版本有一个"通知发送时间戳",每个用户都有一个"上次收到的通知时间戳"。通过比较两者,可以查询尚未收到有关特定版本的通知的用户。

确切的数据模型将取决于您的确切用例,您可能需要跟踪每个用户的多个时间戳(例如,他们关注的每个艺术家(。但我发现总的来说,我可以基于这个模型提出一个合理的解决方案。

not-in运算符现已在Firestore中可用!

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

有关示例的完整列表,请参阅文档:

https://firebase.google.com/docs/firestore/query-data/queries#in_not-in_and_array-contains-any

对于 Elasticsearch 案例,您需要与数据库和 elasticsearch 服务器同步。并且还需要在您的Google云平台上制定防火墙规则,您需要远离对服务器的任意请求,因为它可能会导致带宽成本。

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

请注意 [['USA']] 周围的双数组。 您需要它来过滤掉"国家/地区"数组中具有"美国"的任何文档。

单个数组 ['USA'] 假定"国家"是一个字符串。