使用Vue JS进行Firebase查询

时间:2019-05-16 13:54:48

标签: firebase vue.js firebase-realtime-database

我是Vue JS和Firebase中的新手。我的目标是获取所有具有相同类别的“事件”。我的意思是,让我有两个事件,一个事件类别为“ SMIX”,另一个为“ DAM”。现在我要获取事件类别为“ SMIX”的

我的数据结构在这里: enter image description here

 created() {
            var datos = []

            firebase.database().ref('usuarios').on("value", data => {

                data.forEach(function(user){
                    user.child("eventos").orderByChild("categoria").equalTo("SMIX")
                        .forEach(function(evento){
                        datos.push(evento.val())
                    });
                });

                this.eventos = datos;
            });
        }[My data Structure][1]

1 个答案:

答案 0 :(得分:1)

您的代码中有一些错误和要注意的地方:

首先,如果您收到错误user.child(...).orderByChild is not a function 这是因为对于data.forEach(function(user) {...})userDataSnapshot(请参阅forEach()文档),并且通过在此DataSnapshot上调用child()方法您会得到另一个DataSnapshot ...,它没有orderByChild()方法。

orderByChild()方法是Reference的方法,因此您需要这样做

user.child(...).ref.orderByChild()

使用DataSnapshot的{​​{3}}属性


其次,您不能

user.ref.child("eventos").orderByChild("categoria").equalTo("SMIX")
                        .forEach()

因为您需要使用once()on()方法来获取由Reference表示的数据库位置的数据。


第三次,由于要在循环中执行多个查询,因此需要使用ref方法而不是once()方法。 on()方法设置了一个侦听器,该侦听器连续地“侦听特定位置的数据更改”。


最后,请注意,您需要使用on()来管理对数据库的并行异步查询。


因此,在注意了以上所有要点之后,以下代码就可以解决问题(放入created()):

        var datos = []

        firebase.database().ref('usuarios').once('value')
        .then(dataSnapshot => {
            var promises = [];
            dataSnapshot.forEach(user => {    
                promises.push(user.ref.child("eventos").orderByChild("categoria").equalTo("SMIX").once('value'));
            });
            return Promise.all(promises);
        })
        .then(results => {
            //console.log(results);
            results.forEach(dataSnapshot => {
                dataSnapshot.forEach(evento => {
                    datos.push(evento.val());
                });     
            });
            this.eventos = datos;
        });