如何在 Firebase 表上进行连接

IT技术 javascript firebase
2021-03-06 08:14:37

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

tableOne.on('users', 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) {
     // result // line 2
 });
});

但问题是第 1 行首先执行 6 次,然后第 2 行执行 n 次,导致每次都在寻找“用户 ID 在哪里 - 6”……Firebase 不支持连接吗?

任何帮助都值得赞赏

2个回答

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

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在函数内部捕获的每个值

感谢所有的解决方案....但是 1)在此之后,getPriority 更改了内容的顺序,我在第一个表中设置了优先级,但加入后数据序列是不同的....2)不是受支持的顺序没有优先权?
2021-04-22 08:14:37
弗兰克,谢谢,但这不是完整的代码,当然 userid 是我在 join 上方声明的局部变量,问题是第 1 行首先执行了 6 次,因此它将覆盖 userId 的值,最后一个值将在下一个查询中使用
2021-05-02 08:14:37
即使你userId在 join 上面定义,它仍然会被所有回调共享。并且由于回调是异步触发的(并且通常是成批的),因此您的问题很可能是由此引起的。
2021-05-04 08:14:37
阅读文档的这一部分:firebase.com/docs/rest/guide/...它很好地解释了节点的排序。另外请务必仔细阅读有关 Firebase 的现有问题并在 StackOverflow 上订购。这个话题经常出现。
2021-05-15 08:14:37
弗兰克,我已经在第一张表上使用优先级来获取所需格式的数据,并且在加入两个表之前效果很好,加入数据后就乱了
2021-05-20 08:14:37

列表连接的解决方案:

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