问题
I use tree structures with child references(tree structure). Each node has it's ID,reference its childs, its "weight" (positive integer). Can you help me to write an example how to move through all child node's of specified node and agregate(SUM) child's "weight".
How can I move througn tree nodes?
SOLUTION . Let child's "weight" be additional_time and solving_time. Then let me show code that I use to fill my Mongo base
use TreeMongo;
db.dropDatabase();
use TreeMongo;
db.categoriesPCO.insert({_id:"main_task", parent:null, solving_time:1, additional_time:100});
db.categoriesPCO.insert({_id:"big_task1", parent:"main_task", solving_time:10, additional_time:100});
db.categoriesPCO.insert({_id:"task1.1", parent:"big_task1", solving_time:10, additional_time:100});
db.categoriesPCO.insert({_id:"task1.2", parent:"big_task1", solving_time:20, additional_time:100});
db.categoriesPCO.insert({_id:"task1.3", parent:"big_task1", solving_time:30, additional_time:100});
db.categoriesPCO.insert({_id:"task1.4", parent:"big_task1", solving_time:40, additional_time:100});
db.categoriesPCO.insert({_id:"task1.5", parent:"big_task1", solving_time:50, additional_time:100});
db.categoriesPCO.insert({_id:"big_task2", parent:"main_task", solving_time:20, additional_time:100});
db.categoriesPCO.insert({_id:"task2.1", parent:"big_task2", solving_time:10, additional_time:100});
db.categoriesPCO.insert({_id:"task2.2", parent:"big_task2", solving_time:20, additional_time:100});
db.categoriesPCO.insert({_id:"task2.3", parent:"big_task2", solving_time:30, additional_time:100});
db.categoriesPCO.insert({_id:"task2.4", parent:"big_task2", solving_time:40, additional_time:100});
db.categoriesPCO.insert({_id:"big_task3", parent:"main_task", solving_time:30, additional_time:100});
Here is code of my stored javascript function that I'm using to get node's weight.
db.system.js.save(
{ _id: "count_task_length",
value : function(x) {
var sum=0;
var stack=[];
var item = db.categoriesPCO.findOne({_id:x});
sum = item.solving_time;
stack.push(item);
while (stack.length>0) {
var currentnode = stack.pop();
var children = db.categoriesPCO.find({parent:currentnode._id});
while(true === children.hasNext()) {
var child = children.next();
sum = sum + child.solving_time+child.additional_time;
stack.push(child);
}
}
return sum;
}
}
)
USE this code to check that its working
db.eval( "count_task_length( 'big_task1' )" )
For additional information check this post
来源:https://stackoverflow.com/questions/20453274/stored-mongodb-javascript-function-to-move-through-all-child-nodes-of-specified