欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-13 22:55:19
...

     以前经常适用关系型数据库存储父子级联数据,比如一个菜单下面可能有子菜单,上面可能有父级菜单。实际上就是一种单表自关联结构,通过在当前记录中设置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" } ] }