遍历Firebase数据库的两个不同引用

时间:2018-08-15 10:09:50

标签: javascript firebase firebase-realtime-database

我有一个Firebase数据库,其中在特定的节点级别上有日期,每个日期都有键值对,并带有特定数字的值。现在,我需要查找过去两天中常见的数字。

我首先获取一个日期的快照,然后希望通过另一个日期的快照迭代每个值。

var numbers1 = firebase.database().ref('abc/def/'+date1);
var numbers2 = firebase.database().ref('abc/def/'+date2);
numbers1.on('value',function(snapshot) {

    numbers_day1 = snapshot.val();

});

现在,是否可以同时传递date2的快照,以便进行迭代功能?是否可以在date1事件处理程序本身内部添加另一个date2事件处理程序?

数据库结构:

DATABASE
 [EMP
  [DATE1
   [KEY1
    [NUMBER1]
   ]
   [KEY2
    [NUMBER2]
   ]
  ]
  [DATE2
   [KEY1
    [NUMBER1]
   ]
  ]
 ]

类似地,它还会显示更多的日期和数字。

2 个答案:

答案 0 :(得分:1)

使用Promise.all()方法。像下面一样

var numbers1 = firebase.database().ref('abc/def/'+date1).on('value');
var numbers2 = firebase.database().ref('abc/def/'+date2).on('value');

如果您将数字1和数字2传递给promise.all()方法,因为它们返回了诺言。因此promise.all()方法将等待两个promise返回值。

例如

var numbers1Snap, numbers2Snap ;
Promise.all([numbers1,numbers2]).then(function(snaps){
    numbers1Snap = snaps[0]; // numbers1
    numbers2Snap = snaps[1]; // numbers2
    numbers1Snap.forEach(function(num){
        var num1Key  = num1Snap.key; //for example i'm matching keys to get the data
        numbers2Snap.forEach(function(num2Snap){
            var num2Key = num2Snap.key
            if(num1Key === num2Key){
               console.log("Matching Record " +num2Snap.val());
            }
        }); 
    }); 
});

答案 1 :(得分:0)

也许有更好,更快的解决方案,例如以number1number2处于同一快照下的方式来收缩数据。构建数据和使用索引可能比尝试下面的解决方案更好。

但是您确实询问过迭代,您可以尝试找到一个值,然后搜索第二个值,例如:

var numbers1 = firebase.database().ref("abc/def/" + date1);
var numbers2 = firebase.database().ref("abc/def/" + date2);
numbers1.on("value", function(snapshot) {
    snapshot.forEach(function(rowData) {
        numbers2.on("value", function(snapshot2) {
            snapshot2.forEach(function(rowData2) {
                console.log(rowData2 === rowData);
            });
        });
    });
});