mongodb单集合关联查询parent字段内容
索洪波 2020-09-10 mongodb关联查询
最近在考虑一个树状结构存储。
使用的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'}}
])