【问题标题】:how to do joins on Firebase tables如何在 Firebase 表上进行连接
【发布时间】:2014-09-07 15:50:51
【问题描述】:

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

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 不支持加入吗?

感谢任何帮助

【问题讨论】:

  • 您可能应该阅读这篇文章:firebase.com/blog/2013-10-01-queries-part-one.html#join 并考虑使用这个库:firebase.github.io/firebase-util。另请注意,on('users' 不是有效事件。您可能正在寻找on('value'on('child_added'
  • 弗兰克,我只处理第一个链接,但问题是他们正在获取单个详细信息,我想从第一个表中获取所有详细信息并从第二个表中获取相应详细信息
  • 第二个链接看起来更好,会看看它是否可以帮助我......谢谢
  • 我尝试根据您提供的代码重现您的问题,但没有成功(在我将 on('users' 更改为 on('child_added' 之后)。您可以更新此 jsbin 以使其重现问题吗? jsbin.com/zifeqi/1/edit
  • 感谢弗兰克,你付出了巨大的努力......是的,我已经更改了代码......请查看控制台,您将看到结果集具有相同的用户 ID

标签: javascript firebase


【解决方案1】:

你的代码 sn-p 有一个讨厌的副作用:

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 的每个值。

【讨论】:

  • 弗兰克,谢谢,但这不是完整的代码,当然 userid 是我在连接上方声明的局部变量,问题是第 1 行首先执行了 6 次,所以它将覆盖userId 的值和最后一个值将在下一个查询中使用
  • 即使你在join上面定义了userId,它仍然会被所有回调共享。而且由于回调是异步触发的(通常是分批触发的),因此您的问题很可能是由此引起的。
  • 感谢所有解决方案......但是 1)在此之后 getPriority 改变了内容的顺序,我在第一个表中设置了优先级,但加入后数据顺序不同...... 2) 不支持order by 不优先吗?
  • 阅读这部分文档:firebase.com/docs/rest/guide/…。它很好地解释了节点的顺序。还请务必仔细阅读有关 Firebase 的现有问题,并在 StackOverflow 上订购。这个话题经常出现。
  • 弗兰克,我已经在第一个表上使用优先级来获取所需格式的数据,并且在加入两个表之前它运行良好,加入后数据混乱
【解决方案2】:

列表加入的解决方案:

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

【讨论】:

    猜你喜欢
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多