Монго строит генеалогическое древо



Я пытаюсь построить генеалогическое древо с потенциально бесконечными уровнями родителей и детей. Я также хочу найти братьев, сестер, кузенов и т. д. и меня немного смущает подход построения массива в 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] }


Я могу легко зациклить каждого ребенка с помощью идентификаторов и вывести его, но это не даст структуру детей детей просто петли и выходы.



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


Я пытался создать две глобальные переменные ascendants и descendants, чтобы я мог зациклить родителей, бабушек и дедушек и т. д. и помещают туда своих детей и детей чилдена (для братьев, а затем племянников и т. д.). а потом то же самое с потомками. Это оказалось сложным из-за наличия нескольких гнезд и необходимости добавлять запись внутри другой записи.



Надеялся, что кто-то сможет помочь мне в структурировании этого. Так что я мог бы получить что-то, что может быть встроен в семейное дерево HTML/CSS. Чтобы получить не-детей / родителей, мне, вероятно,придется условно повторить цикл?



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

}
}
599   1  

1 ответ:

С вашей текущей структурой и небольшой модификацией вашей реализации вы можете найти родителей данного id и детей данного parent id.

Пусть корень-переменная, содержащая выходную структуру:

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.

Comments

    Ничего не найдено.