我知道很难通过数组中不存在的值来查询,但是有没有办法做到这一点呢?
这是我的情况-我有一个基于订阅的服务,人们可以选择加入并“关注”特定的艺术家。在我的后端,这将创建一个订阅文档,其中包含他们的followerId,他们想要关注的艺术家的ID(称为artistId)和一个名为push的数组。歌手可以添加新专辑,然后在将来向每个关注者发送特定歌曲的通知。我想跟踪哪个从动程序已被推送到哪个发行版,以及在上述推送数组中完成的操作。我需要一种方法来确定哪些追随者已经被推送了特定版本,所以...
我当时想合并两个查询,但不确定是否可行。像这样:
db.collection('subscriptions').where('artistId', '==', artistId)
db.collection('subscriptions').where('artistId', '==', artistId).where('pushed', 'array-contains', releaseId)
然后取两个查询结果的交集并从第一个查询中减去,以获得尚未推送到特定版本的关注者。
这可能吗?还是有更好的方法?
答案 0 :(得分:2)
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
答案 1 :(得分:0)
无法查询Firestore 没有具有特定字段或值的文档。这不是“非常困难” ,但根本不可能。要了解有关原因的更多信息,请参见:
您的解决方法是可能的,并且从技术上讲还不是很复杂。唯一要记住的是,您需要加载所有艺术家。因此,表演将与您拥有的艺术家数量成线性关系。目前,这对您的应用可能很好,但是绝对可以对它进行一些测量。
通常,我的解决方法是不跟踪发布给用户的什么版本,而是跟踪上次发布给用户的时间。假设一个版本具有“通知发送时间戳”,而每个用户都有“最后接收到的通知时间戳”。通过比较两者,您可以查询尚未收到有关特定版本的通知的用户。
确切的数据模型将取决于您的确切用例,并且您可能需要跟踪每个用户的多个时间戳(例如,他们跟随的每个艺术家)。但是我发现一般而言,我可以基于此模型提出合理的解决方案。
答案 2 :(得分:0)
Firestore有很多限制,为了克服这些限制,我目前正在使用ElasticSearch,使用Cloud Functions将Firestore集合同步到ElasticSearch,并查询ElasticSearch以查找Firestore无法开箱即用的功能。
查看有关如何编写自己的Cloud Functions的链接-> https://firebase.google.com/docs/firestore/extend-with-functions
答案 3 :(得分:0)
对于Elasticsearch,您需要与数据库和elasticsearch服务器同步。并且还需要在您的Google Cloud Platform上制定防火墙规则,您需要避免对服务器的任意请求,因为这可能会导致成本增加。
答案 4 :(得分:0)
@import url('https://fonts.googleapis.com/css2?family=Raleway:wght@200&display=swap');
html {
font-size: 1rem;
font-family: 'Raleway', sans-serif;
line-height: 40px;
background-image: linear-gradient( rgba(255, 0, 0, 0.45), rgba(1,1,0,.0)), url(https://cdn.freecodecamp.org/testable-projects-fcc/images/survey-form-background.jpeg);
background-attachment: fixed;
margin: 25rem;
}
body{
color: white;
background-color: rgba(107, 137, 97, 0.7);
}
@media (max-width: 900px) {
body{
color: white;
background-color: rgba(107, 137, 97, 0.7);
margin: auto;
padding: 0.5rem;
}
}
.top-inputs {
width: 80%;
}
#comment {
height: 4rem;
}
注意 [['USA']] 周围的双数组。您需要使用它来过滤掉在 'country' 数组中包含 'USA' 的所有文档。
单个数组 ['USA'] 假定 'country' 是一个字符串。