Javascript 如何在Firebase表上进行连接

Javascript 如何在Firebase表上进行连接,javascript,firebase,Javascript,Firebase,我试图从两个表中获取数据,如(获取所有用户及其详细信息) 但问题是,第1行先执行6次,然后第2行执行n次,导致每次查找“where user id is-6”…Firebase不支持联接吗 任何帮助都是值得的您的代码片段有一个令人讨厌的副作用: var userId; tableOne.on('value', function (snapshot) { userId = snapshot.val().userId; // line 1 (results like 1,2,3,4,5,6)

我试图从两个表中获取数据,如(获取所有用户及其详细信息)

但问题是,第1行先执行6次,然后第2行执行n次,导致每次查找“where user id is-6”…Firebase不支持联接吗


任何帮助都是值得的

您的代码片段有一个令人讨厌的副作用:

var userId;
tableOne.on('value', function (snapshot) {
    userId = snapshot.val().userId; // line 1 (results like 1,2,3,4,5,6)
    anotherTable.child('userdetails').child(userId).once('value', function(mediaSnap) {
        console.log(userId + ":" + mediaSnap.val().name);
    });
});
您没有将
userId
声明为变量,这意味着它将成为JavaScript中的全局变量。由于回调函数是异步执行的,所以在您需要它的时候,全局值很有可能已经改变了

解决方案只是将
userId
作为回调函数的局部变量:

tableOne.on('value', function (snapshot) {
    var userId = snapshot.val().userId; // line 1 (results like 1,2,3,4,5,6)
    anotherTable.child('userdetails').child(userId).once('value', function(mediaSnap) {
        console.log(userId + ":" + mediaSnap.val().name);
    });
});

这将确保在函数中捕获
userId
的每个值。

您的代码片段有一个令人讨厌的副作用:

var userId;
tableOne.on('value', function (snapshot) {
    userId = snapshot.val().userId; // line 1 (results like 1,2,3,4,5,6)
    anotherTable.child('userdetails').child(userId).once('value', function(mediaSnap) {
        console.log(userId + ":" + mediaSnap.val().name);
    });
});
您没有将
userId
声明为变量,这意味着它将成为JavaScript中的全局变量。由于回调函数是异步执行的,所以在您需要它的时候,全局值很有可能已经改变了

解决方案只是将
userId
作为回调函数的局部变量:

tableOne.on('value', function (snapshot) {
    var userId = snapshot.val().userId; // line 1 (results like 1,2,3,4,5,6)
    anotherTable.child('userdetails').child(userId).once('value', function(mediaSnap) {
        console.log(userId + ":" + mediaSnap.val().name);
    });
});

这将确保在函数中捕获用户ID的每个值。

列表联接解决方案:

tableOne.orderByKey().on("value", function (snapshot) {
    //console.log(snapshot.val());
    snapshot.forEach(function (data) {
        tableTwo.once('value').then(function (info) {
            info = info.val();
        });
    });
});

列表联接解决方案:

tableOne.orderByKey().on("value", function (snapshot) {
    //console.log(snapshot.val());
    snapshot.forEach(function (data) {
        tableTwo.once('value').then(function (info) {
            info = info.val();
        });
    });
});


你可能应该阅读这篇文章:并考虑使用这个图书馆:还要注意,
on('users'
不是有效的事件。您可能正在查找
on('value'
on)('child_added'
。Frank,我只在第一个链接上工作,但问题是他们正在获取单个详细信息,我想从第一个表中获取所有详细信息,并从第二个表中获取相应的详细信息。第二个链接看起来更好,将查看是否可以帮助我…谢谢我尝试根据您提供的代码重现您的问题,但没有成功ess(在我将('users'更改为('child\u added'之后)你能更新这个JSBN,这样它会产生问题吗?谢谢弗兰克,这是你做的很好的努力……是的,我已经改变了代码……请看一下控制台,你会看到结果集有相同的用户IDU你可能应该读这篇文章:并考虑使用这个库:('users'不是有效的事件。您可能正在查找上的
('value'
或上的
)('child_added'
。Frank,我只在第一个链接上工作,但问题是他们正在获取单个详细信息,我想从第一个表中获取所有详细信息,并从第二个表中获取相应的详细信息。第二个链接看起来更好,将查看是否可以帮助我…谢谢我尝试根据您提供的代码重现您的问题,但没有成功ess(在我将('users'更改为('child\u added'之后)。你能更新这个jsbin,让它重现问题吗?谢谢Frank,这是你做的非常好的工作…是的,我已经更改了代码…请查看控制台,你会看到结果集具有相同的用户idFrank,谢谢,但这不是完整的代码,当然userid是一个局部变量,我已经在连接上方声明了,p问题是第1行先执行6次,因此它将覆盖userId的值,最后一个值将在下一次查询中使用。即使您在连接上方定义了
userId
,它仍将由所有回调共享。而且,由于回调是异步启动的(通常是成批启动的),您的问题很可能是由此引起的。感谢所有的解决方案…但是1)在此之后,getPriority更改了内容的顺序,我在第一个表中设置了优先级,但在联接之后,数据序列不同不支持没有优先级的order by吗?请阅读文档的这一部分:。它很好地解释了节点的排序。另外,请务必仔细阅读有关Firebase和StackOverflow上的order的现有问题。此主题经常出现。Frank,我已经在使用第一个表上的优先级以所需的格式获取数据格式,在连接两个表之前它工作得很好,连接后数据会被弄乱,谢谢,但这不是完整的代码,当然userid是一个局部变量,我在连接上面声明了它,问题是第1行先执行了6次,所以它将覆盖userid的值,最后一个值将在下一个查询即使您在联接上面定义了
userId
,它仍将由所有回调共享。由于回调是异步启动的(通常是成批启动的),您的问题很可能就是由此引起的。感谢所有的解决方案……但是1)在此之后,getPriority更改了内容的顺序,我在第一个表中设置了优先级,但在联接之后,数据序列不同不支持没有优先级的order by吗?请阅读文档的这一部分:。它很好地解释了节点的排序。另外,请务必仔细阅读有关Firebase和StackOverflow上的order的现有问题。此主题经常出现。Frank,我已经在使用第一个表上的优先级以所需的格式获取数据格式,它在连接两个表之前运行良好,在连接数据之后则会出现混乱