使用Firebase有条件地检索数据

时间:2017-11-17 19:58:05

标签: angular firebase angularfire

我的Firebase数据库包含具有以下格式的对象:

"documentation": {
   "scotch": {
     "URL": "https://scotch.io",
     "description": "Fun and practical web development",
     "level": 0,
     "name": "Scotch",
     "tech": ["angular", "angularjs", "react", "laravel", "java"],
     "type": "web"
   },
   ...
}

我希望使用tech属性检索所述对象的列表 例如,我想查询包含技术documentation的每个angular;可以实现吗?

到目前为止,我过滤文档的唯一方法是查询所有文档:

dbRef = this.firebase.database().ref().child('documentation');

this.dbRef.on('value', snap => {
   documentation = snap.val();
}

并将其过滤到客户端,如果我的问题得到解答,这将是不必要的。

谢谢!

更新

我可以按typeleveldescription(每个具有一个值的键)进行查询,但似乎无法通过{{查询1}}因为它是一个字符串数组。

我是这样做的:

tech

1 个答案:

答案 0 :(得分:0)

您需要创建" tech"的索引。从中查询。这将需要维护额外的数据结构,但查询将很简单。

{
  "documentation": {
     "scotch": {
       "URL": "https://scotch.io",
       "description": "Fun and practical web development",
       "level": 0,
       "name": "Scotch",
       "tech": ["angular", "angularjs", "react", "laravel", "java"],
       "type": "web"
     }  
  },
  "tech": {
    "angular": {
       "scotch": {
         ... demnormalized value
       }
    },
    "angularjs": {
       "scotch": {
         ... demnormalized value
       }
    },
    "react": {
       "scotch": {
         ... demnormalized value
       }
    }
  }
}

通过这种方式,您可以轻松查询:

const createTechRef = (tech) => {
  return firebase.database().ref('tech').child(tech);
};

const angularRef = createTechRef('angular');
angularRef.on('value', snap => {
  // all angular "techs"
});