我的数据库结构如下(简化):
{
"articles": {
"-uniqueId1": {
"title": "Article 1",
"category": "news"
},
"-uniqueId2": {
"title": "Article 2",
"category": "other"
},
"-uniqueId3": {
"title": "Article 3",
"category": "news"
},
"-uniqueId4": {
"title": "Article 4",
"category": "news"
}
},
"articlesByCategory": {
"news": {
"-uniqueId1": true,
"-uniqueId3": true,
"-uniqueId4": true
},
"other": {
"-uniqueId2": true
}
}
}
查询需要获取特定文章类别不在其中的文章。那有意义吗?比如说,如果uniqueId2
属于“其他”类别,则查询只会获取“新闻”和所有其他现有类别中的文章。但是,由于列表可能包含数百万篇文章,因此我必须尽可能具体,而不是获取与此准确标准不匹配的文章。因此,如下所示的查询将是理想的:
const ref = firebase.database().ref("articlesByCategory");
ref.orderByChild("-uniqueId2").equalTo(null).once("value", function(snapshot) {
console.log(snapshot.key);
});
我在这里搜索缺少特定属性的类别(属性等于null
)。这在此解释:Firebase: Query to exclude data based on a condition
但是,执行这样的查询需要我在安全规则中的“/ articlesByCategory”上索引每篇文章的唯一ID。但是在“.indexOn”数组中动态添加新文章ID是不现实和非最佳的,因为最终会产生数百万个独特的(自动生成的)ID:
{
"articles": {
".read": true,
".write": true
},
"articlesByCategory": {
".read": true,
".write": true,
".indexOn": ["-uniqueId1", "-uniqueId2", "-uniqueId3", "-uniqueId4"...] // List would be endless!
}
}
那么这怎么可以实现呢?为什么我在StackOverflow上到处都看到这些类型的结构(反向索引)作为理想解决方案,但似乎没有人能解决这个问题?
答案 0 :(得分:0)
Firebase只能查询具有自动生成ID的节点上的订单语句,当您定义自己的密钥时,firebase无法执行任何排序/排序
生成密钥的理想方法是
firebase.getInstance().getReference("articles").push(myArticle);
这将导致稍微不同的数据库结构,如
{
"12dakj137_9": { // this is a auto-generated id
"article1": {
"title": "Article 1",
"category": "news"
},
"12asjh_123": {
"title": "Article 2",
"category": "other"
},...
}
现在firebase可以订购/排序,你的方式是
firebase.getInstance().child("articles").orderByChild("category").equalTo("other");