这个算法的优点是简单,支持无限深度树、查询子树时无需递归、删除节点和偶尔插入节点时可以做到无需修改其它记录(行号跳号设计),从以下示例代码中就可以看出这种方案的简洁性:
- Books
- |-Programning
- | |-Languages
- | |-Databases
- | | |-MongoDB
- | | | |-MongoTree
- | | |-dbm
- |-Arts
-
- db.book.insert({ _id: “Books”, line:1000,level:1} );
- db.book.insert({ _id: “Programming”, line:2000,level:2} );
- db.book.insert({ _id: “Languages”, line:3000,level:3} );
- db.book.insert({ _id: “Databases”, line:4000,level:3} );
- db.book.insert({ _id: “MongoDB”, line:5000,level:4} );
- db.book.insert({ _id: “MongoTree”, line:6000,level:5} );
- db.book.insert({ _id: “dbm”, line:7000,level:4} );
- db.book.insert({ _id: “Arts”, line:8000,level:2} );
- db.book.insert({ _id: “EndTag”, line:10000,level:0} );
-
- //查询节点 “Databases”下的所有子节点:
- db.book.createIndex( {line:1});
- var node = db.book.findOne( { _id: “Databases” } );
- var next=db.book.findOne( { $and: [ {line: {$gt:node.line}}, {level:{$lte: node.level }}] } );
- db.book.find( {$and: [{line: { $gt: node.line }}, {line: { $lt: next.line }}] } );
-
- //插入一个新节点,不需要对其它行号执行加1操作,因为这个示例中行号是跳号设计的,节点可以插入在两个行号的中间
- db.book.insert({ _id: “MySql”, line:6500,level:5} );
-
- //删除一个节点,真接删就可以了
- db.book.remove({ _id: “Languages”} );