mongodb单集合关联查询parent字段内容

1,749 阅读1分钟

最近在考虑一个树状结构存储。

使用的mongodb,同一张集合中,使用parentId来做关联。

查询的时候,希望将parent对应的name作为parentName返回回来。

集合内容示例

{ "_id" : ObjectId("5f50c5fb8f0d74536bbfb7a4"), "name" : "菜单管理", "parent" : "" }
{ "_id" : ObjectId("5f524416ff216c2cbc554907"), "name" : "频道管理", "parent" : "5f50c5fb8f0d74536bbfb7a4" }
{ "_id" : ObjectId("5f576677d9588f3d78fbdb74"), "name" : "分类管理", "parent" : "5f524416ff216c2cbc554907" }
{ "_id" : ObjectId("5f588b22499cd2538411b98a"), "name" : "发布管理", "parent" : "5f50c5fb8f0d74536bbfb7a4" }
{ "_id" : ObjectId("5f588b85499cd2538411b98b"), "name" : "权限管理", "parent" : "5f50c5fb8f0d74536bbfb7a4" }
{ "_id" : ObjectId("5f588f8358bc0d3e647403a1"), "name" : "菜单管理", "parent" : "5f588b85499cd2538411b98b" }

期望结果

将parent的name作为parentName和查询结果一起返回

{ "_id" : ObjectId("5f524416ff216c2cbc554907"), "name" : "频道管理", "parent" : "5f50c5fb8f0d74536bbfb7a4", "parentName": "菜单管理" }

查询语句

  • $match查询到对应内容
  • $project将parent转换为ObjectID格式的_parent
  • $lookup单表联查查询_parent对应的ID的那一条数据,返回一个数组 _parnetList
  • $unwind 分解这个数组
  • $project再将_parentList.name重命名为parentName
db.menu.aggregate([
	{$match:{name:'频道管理'}},
	{$project:{'_parent':{$toObjectId:'$parent'},name:1,parent:1}},
	{$lookup:{from:'menu',localField:'_parent',foreignField:'_id',as:'_parentList'}},
	{$unwind:'$_parentList'},
	{$project:{name:1,parent:1,parentName:'$_parentList.name'}}
	])