Firebase查询 - 索引唯一ID

时间:2017-03-19 22:01:37

标签: javascript node.js firebase firebase-realtime-database

我的数据库结构如下(简化):

{
  "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上到处都看到这些类型的结构(反向索引)作为理想解决方案,但似乎没有人能解决这个问题?

1 个答案:

答案 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");