如果您使用的是 mongo 3.4+,请尝试此聚合
您可以使用$graphLookup 进行分层查询$graphLookup
db.locales.aggregate(
[
{$graphLookup : {
from : "locales",
startWith : "$parentId",
connectFromField : "parentId",
connectToField : "id",
as : "parents"
}
},
{$addFields : {localeName : {$substr : [{$concat : [{$reduce : {input : "$parents", initialValue : "", in : {$concat : ["$$value", " > ", "$$this.localeName"]}}}, " > " ,"$localeName"] }, 3 , 1000]}}},
{$project : {parents : 0}}
]
).pretty()
收藏
> db.locales.find()
{ "_id" : ObjectId("5a73dead0cfc59674782913a"), "id" : 123, "localeName" : "Test", "parentId" : null }
{ "_id" : ObjectId("5a73dead0cfc59674782913b"), "id" : 456, "localeName" : "Test 1", "parentId" : 123 }
{ "_id" : ObjectId("5a73dead0cfc59674782913c"), "id" : 789, "localeName" : "Test 2", "parentId" : 456 }
>
结果
> db.locales.aggregate( [ {$graphLookup : { from : "locales", startWith : "$parentId", connectFromField : "parentId", connectToField : "id", as : "parents" } }, {$addFields : {localeName : {$substr : [{$concat : [{$reduce : {input : "$parents", initialValue : "", in : {$concat : ["$$value", " > ", "$$this.localeName"]}}}, " > " ,"$localeName"] }, 3 , 100]}}}, {$project : {parents : 0}} ] ).pretty()
{
"_id" : ObjectId("5a73dead0cfc59674782913a"),
"id" : 123,
"localeName" : "Test",
"parentId" : null
}
{
"_id" : ObjectId("5a73dead0cfc59674782913b"),
"id" : 456,
"localeName" : "Test > Test 1",
"parentId" : 123
}
{
"_id" : ObjectId("5a73dead0cfc59674782913c"),
"id" : 789,
"localeName" : "Test > Test 1 > Test 2",
"parentId" : 456
}