来自符合条件的元素的项目价值

时间:2019-02-19 09:51:22

标签: mongodb

我需要将文档从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"    } } }

关于如何做到这一点的任何想法?

0 个答案:

没有答案