Mongo建立一个家谱

时间:2014-12-27 04:44:15

标签: javascript mongodb

我正在努力建立一个家庭树,可能有无限级别的父母和孩子。我也想找到兄弟,姐妹,表兄弟等等,当数据只给每个人的父母时,我对Javascript中构建数组的方法感到有点困惑。

在名为"用户"的MongoDB集合中我有以下条目

{ id: 1, name: "Target", parents: [3,4] }
{ id: 2, name: "Wife" }
{ id: 3, name: "Dad", parents: [5,6] }
{ id: 4, name: "Mom" }
{ id: 5, name: "Dads Dad", parents: [7,8] }
{ id: 6, name: "Dads Mom" }
{ id: 7, name: "Dads Dads Dad", parents: 9 }
{ id: 8, name: "Dads Dads Mom" }
{ id: 9, name: "Dads Dads Dads Dad" }
{ id: 10, name: "Son", parents: [1, 2] }
{ id: 11, name: "Sons Son", parents: [10] }
{ id: 12, name: "Sons Sons Son", parents: [11] }
{ id: 13, name: "Brother", parents: [3,4] }
{ id: 14, name: "Brothers Son", parents: [13] }
{ id: 15, name: "Uncle", parents: [5,6] }
{ id: 16, name: "Aunt", parents: [5,6] }
{ id: 17, name: "Daughter", parents: [5,6] }

我可以轻松地使用id循环每个孩子并输出它,但它不会给孩子的子结构只是循环和输出。

getChildren = function(id) {
    var children = Users.find({parents: id});
    children.forEach(function(child) {
        console.log(child);
        getChildren(child.id);
    });
};

我一直在尝试创建两个全局变量ascendantsdescendants,以便我可以循环父母,祖父母等,并将他们的孩子和孩子的孩子窝在里面(兄弟们)然后是侄子等)。然后与后代相似。由于有多个巢并且必须能够在另一个条目中添加条目,因此这变得很复杂。

希望有人可以帮我构建这个。所以我可以获得可以构建到HTML / CSS系列树中的东西。为了得到非孩子/父母,我可能需要有条件地再次循环?

descendents = {
    10: {           // son
        11: {       // grandson
            12: {}  // great grandson
        }
    },
    17: {           // daughter

    }
}

1 个答案:

答案 0 :(得分:2)

使用您当前的结构并稍微修改您的实现,您可以找到给定id的父级和给定parent id的子级。

让root为保存输出结构的变量:

var root = {};

查找所有后代的递归函数:

var getDescendants = function(id,root) {
    var children = Users.find({parents: id});
    children.forEach(function(child) {
        root[child.id] = {"name":child.name};
        getChildren(child.id,root[child.id]);
    });
};

getDescendants (3,root);

样本o / p:

 > root
{
        "1" : {
                "10" : {
                        "11" : {
                                "12" : {
                                        "name" : "Sons Sons Son"
                                },
                                "name" : "Sons Son"
                        },
                        "name" : "Son"
                },
                "name" : "Target"
        },
        "13" : {
                "14" : {
                        "name" : "Brothers Son"
                },
                "name" : "Brother"
        }
}

查找所有祖先的递归函数。

var getAscendants = function(id,root) {
    var rec = Users.findOne({id: id});
    if(rec.hasOwnProperty("parents")){
      (rec["parents"]).forEach(function(parent) {
        root[parent] = {};
        getAscendants(parent,root[parent]);
    });
    }
};
var root = {};
getAscendants(12,root);
  

为了得到非孩子/父母,我可能需要有条件   再次循环

是。您可以使用$nin运算符。