利用mongodb聚合操作$graphLookup实现递归

阅读更多

     以前经常适用关系型数据库存储父子级联数据,比如一个菜单下面可能有子菜单,上面可能有父级菜单。实际上就是一种单表自关联结构,通过在当前记录中设置parentId指向父记录的id来实现递归。

     在mongodb中可以利用聚合+$graphLookup表达式+$match表达式+管道(pipeline)来实现类似操作,具体用一个例子来说明:

   1. 场景:员工的报告关系(reportingTo),比如程序员向组长报告,组长向经理报告,经理向分管副总报告。。。,可以形成一个递归的层级关系保存在一个collection里,mongodb数据如下:

{ "_id" : 1, "name" : "Dev" }
{ "_id" : 2, "name" : "Eliot", "reportsTo" : "Dev" }
{ "_id" : 3, "name" : "Ron", "reportsTo" : "Eliot" }
{ "_id" : 4, "name" : "Andrew", "reportsTo" : "Eliot" }
{ "_id" : 5, "name" : "Asya", "reportsTo" : "Ron" }
{ "_id" : 6, "name" : "Dan", "reportsTo" : "Andrew" }

 

2. 实现代码:

 db.employees.aggregate([{$match: { name: 'Dan' }},{$graphLookup:{from: "employees",startWith:"$reportsTo",connectFromField:"reportsTo",connectToField:"name",as:"报告层级"}}])

 

输出结果如下:

{ "_id" : 6, "name" : "Dan", "reportsTo" : "Andrew", "报告层级" : [ { "_id" : 1, "name" : "Dev" }, { "_id" : 2, "name" : "Eliot", "reportsTo" : "Dev" }, { "_id" : 4, "name" : "Andrew", "reportsTo" : "Eliot" } ] }

 

 

 

你可能感兴趣的:(利用mongodb聚合操作$graphLookup实现递归)