我需要将文档从mongo集合转换为更“扁平”的结构,以便可以将其加载到关系数据库中。 我正在通过python运行此过程,但是我试图在mongo查询(我将使用pymongo执行)中实现大部分功能,以提高效率。 大部分的工作都可以通过基本的投影来实现,但是我为此感到困惑。
从下面的示例文档中,您可以看到“ id”数组,其中每个数组都包含元素及其值的描述。我需要获取值,并将其投影到以描述为名称的字段中。在真实的示例中,每个文档可能有大约30个不同的“描述/值对”,而并非每个文档都有每个。
示例文档
{
"_id" : ObjectId("5c6ae3c389f87744c00d60c6"),
"person" : {
"name" : {
"formattedName" : "FullName",
"firstName" : "FirstName",
"surname" : "Surname"
},
"id" : [
{
"value" : "123456",
"description" : "EmployeeNumber"
},
{
"value" : "ABC123",
"description" : "costCentre"
},
{
"value" : "Department1",
"description" : "Department"
}
]
}
}
所需的输出
{
"_id" : ObjectId("5c6ae3c389f87744c00d60c6"),
"full_name" : "FullName",
"first_name" : "FirstName",
"last_name" : "Surname",
"EmployeeNumber" : "123456",
"costCentre" : "ABC123",
"Department" : "Department1"
}
我已经设法像这样对单个“描述”进行了
db.getCollection('sample').aggregate(
{"$unwind" : "$person.id"},
{"$match" :{"person.id.description":"EmployeeNumber"}},
{"$project":{
"_id": 1,
"full_name" :"$person.name.formattedName",
"first_name":"$person.name.firstName",
"last_name" :"$person.name.surname",
"EmployeeNumber":"$person.id.value"} }
)
但是我找不到所有描述的方法。
我试图通过删除$ match并在投影中替换为elemMatch来对投影中的$ elemMatch进行操作,如下所示,但这不起作用
"EmployeeNumber": { "$person.id.value" : {"$elemMatch" : {"person.id.description":"EmployeeNumber"} } },
"costCentre" : { "$person.id.value" : {"$elemMatch" : {"person.id.description":"costCentre" } } },
"Department" : { "$person.id.value" : {"$elemMatch" : {"person.id.description":"Department" } } }
关于如何做到这一点的任何想法?