Я не уверен, зачем вам это нужно, просто на случай, если у вас есть какая-либо проверка схемы, вы можете получить оттуда ключи, если нет, скажем, поля в каждом документе в коллекции отличаются от других, тогда у каждого документа есть свой схема т.е. это собственный набор пар / полей ключ-значение. В таком случае вам нужны ключи для всех документов в коллекции или у вас нет этого сценария (все документы выглядят одинаково)? В любом случае, с помощью кода можно легко сделать несколько вещей, но с помощью этого запроса вы можете сделать это в MongoDB, а также до определенных уровней поля:
db.collection.aggregate([{ $limit: 1 }, { $project: { data: { $objectToArray: "$$ROOT" } } },
{
$project:
{
"data": {
$arrayToObject: {
$map: {
input: '$data', as: 'each', in:
{
$switch:
{
branches: [
{
case: { $eq: [{ $type: '$$each.v' }, 'object'] },
then: { k: '$$each.k', v: { $arrayToObject: { $map: { input: { $objectToArray: "$$each.v" }, as: 'each', in: { k: '$$each.k', v: { $type: '$$each.v' } } } } } }
},
{
case: { $isArray: "$$each.v" },
then: {
k: '$$each.k', v:
{
$map: {
input: "$$each.v", as: 'each', in:
{
$cond: [{ $eq: [{ $type: '$$each' }, 'object'] },
{ $arrayToObject: { $map: { input: { $objectToArray: "$$each" }, as: 'each', in: { k: '$$each.k', v: { $type: '$$each.v' } } } } },
{ $type: '$$each' }]
}
}
}
}
}
],
default: { k: '$$each.k', v: { $type: '$$each.v' } }
}
}
}
}
}
}
}, { $replaceRoot: { newRoot: "$data" } }
])
Тест: MongoDB -Playground
Примечание: Если вы хотите записать агрегированный вывод в новую коллекцию, используйте $ merge или $ out .