2016-11-25 5 views
3

Я использую экспресс-рамки с мангуста, и у меня есть следующие схемы:получить все дети рекурсивно с использованием мангуста схемы

var DocumentSchema = new Schema({ 
    name: String, 
    description: String, 
    parent: { 
     type: Schema.Types.ObjectId, 
     ref: "Document" 
    }, 
    children: [{ 
     type: Schema.Types.ObjectId, 
     ref: 'Document' 
    }] 
}); 

Я пытаюсь получить динамическое дерево иерархии детей, но я не мог найти подходящее решение.

Можно ли это сделать, используя эту схему? Если нет, то какую структуру схемы я должен использовать?

ответ

0

Я не уверен, что вы имеете в виду под деревом иерархии детей. Примером желаемого вывода данных было бы полезно.

Если вам необходимо загрузить все потомки конкретного узла, используя вашу схему в плоскую структуру вы можете использовать что-то вроде этого:

getAllChildNodes(startNodeId, callback) { 
    const tree = []; 
    let idsToLoad = []; 

    yourModel.findOne({_id: startNodeId }).exec((err, node) => { 
    tree.push(node); 
    idsToLoad = node.children; 
    let count = 0; 

    async.whilst(
    () => { 
     return count < idsToLoad.length 
     }, 
     (cb) => { 
     yourModel.findOne({_id: idsToLoad[count] }).exec((err, doc) => { 
      tree.push(doc); 
      idsToLoad = idsToLoad.concat(doc.children); 
      count++; 
      cb(); 
     }); 
     }, 
     (err) => { 
     if (err) { 
      console.error(err); 
      return callback(err); 
     } 
     return callback(null, tree); 
     } 
    ); 

    }); 
} 

Это может быть довольно дорогим запрос и не очень эффективным. Я бы не рекомендовал этот тип схемы, если это основной вариант использования для вас. Я бы посмотрел на использование Materialized Paths или Nested Sets, если ваши данные статичны.

Смежные вопросы