Вы можете использовать ниже aggregation
db.collection.aggregate([
{ "$project": { "data": { "$objectToArray": "$$ROOT" }}},
{ "$project": {
"data": {
"$map": {
"input": "$data",
"in": {
"$cond": [
{ "$eq": [{ "$type": "$$this.v" }, "object"] },
{ "k": "$$this.k", "v": { "$objectToArray": "$$this.v" }},
"$$this"
]
}
}
}
}},
{ "$project": {
"data": {
"$map": {
"input": "$data",
"as": "d",
"in": {
"k": "$$d.k",
"v": {
"$map": {
"input": { "$cond": [{ "$eq": [{ "$type": "$$d.v" }, "array"] }, "$$d.v", []] },
"as": "v",
"in": { "v": { "$concat": ["$$d.k", ".", "$$v.k"] }}
}
}
}
}
}
}},
{ "$project": {
"finalKeys": {
"$concatArrays": [
{ "$reduce": {
"input": "$data.v",
"initialValue": [],
"in": { "$concatArrays": ["$$value", "$$this.v"] }
}},
"$data.k"
]
}
}}
])
Выход
[
{
"finalKeys": [
"Personal.Email",
"Personal.FirstName",
"Personal.LastName",
"Car.CarType",
"_id",
"UserId",
"Personal",
"Car"
]
}
]