Firebase - 查询链

时间:2017-03-21 02:35:09

标签: angularjs node.js firebase firebase-realtime-database

所以我在这里有一个有趣的问题。我们的软件包括一个功能,允许基于销售代表,经理和我们的用户在使用我们的软件时希望支持的许多层次之间的层次结构进行动态佣金分配。用户可能看起来像这样:

$uid
    fname
    lname
    lineage
         fatherlink
               $uid_of_another_user
         childlink
               $uid_of_another_user
               $uid_of_another_user

好的,现在让我们说childlink对象中的每个子节点都包含两个子节点。我希望能够从一位经理开始,例如,创建一个包括他所有孩子和他孩子的孩子等等的阵列......因为我们支持尽可能多的管理级别,所以在给定的孩子下查询用户需要是动态的。这就是我们现在拥有的。

var children = [];
        _.child('user/' + $localStorage.currentUser.uid + '/lineage/child_link').on('value', function(sn1) {
            sn1.forEach(function(sn2) {
                _.child('user/' + sn2.key + '/lineage/child_link/').on('value', function(sn3) {
                    sn3.forEach(function(sn4) {
                        _.child('user/' + sn4.key + '/lineage/child_link/').on('value', function(sn5) {
                            sn5.forEach(function(sn6) {
                                _.child('user/' + sn6.key + '/lineage/child_link/').on('value', function(sn7) {
                                    sn7.forEach(function(sn8) {
                                        _.child('user/' + sn8.key + '/lineage/child_link/').on('value', function(sn9) {
                                            sn9.forEach(function(sn11) {
                                                _.child('user/' + sn11.key + '/lineage/child_link/').on('value', function(sn12) {
                                                    sn12.forEach(function(sn13) {
                                                        children.push(sn13.key)
                                                    })
                                                });
                                                children.push(sn11.key)
                                            })
                                        });
                                        children.push(sn8.key)
                                    })
                                });
                                children.push(sn6.key)
                            })
                        });
                        children.push(sn4.key)
                    })
                });
                children.push(sn2.key)
            })
        });
        return children;

显然,问题是这只能查询6层深度。有任何想法吗?甚至可能?

1 个答案:

答案 0 :(得分:0)

感谢@georgeawq这是我们的解决方案:

    children: function(callback) {
        function getChildren(a) {
            _.child("user/" + a + "/lineage/child_link/").once("value", function(a) {
                null != a.val() ? a.forEach(function(a) {
                    children.push(a.key), getChildren(a.key)
                }) : children.sort(); callback(children)
            })
        }
        var children = [];
        getChildren($localStorage.currentUser.uid);
    },

基本但完美的解决方案。谢谢!