利用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" } ] }
上一篇: MySql索引知识点整理(一)
推荐阅读
-
基于Morphia实现MongoDB按小时、按天聚合操作方法
-
利用mongodb聚合操作$graphLookup实现递归
-
Mongodb聚合函数count、distinct、group如何实现数据聚合操作
-
基于Morphia实现MongoDB按小时、按天聚合操作
-
利用MongoDB中oplog机制实现准实时数据的操作监控
-
基于Morphia实现MongoDB按小时、按天聚合操作方法
-
基于Morphia实现MongoDB按小时、按天聚合操作
-
php中如何利用递归实现文件夹的复制删除以及查看大小的操作示例
-
php中如何利用递归实现文件夹的复制删除以及查看大小的操作示例
-
Mongodb聚合函数count、distinct、group如何实现数据聚合操作