Python 将不同的嵌入式结构投影到相同的名称

Python 将不同的嵌入式结构投影到相同的名称,python,mongodb,pymongo,aggregation-framework,Python,Mongodb,Pymongo,Aggregation Framework,我正在编写一个python脚本来执行以下任务: 查询带有嵌入文档的MongoDB集合 聚合和项目以更改查询中返回的字段名,使其与“u_”约定匹配 通过RESTAPI将值导入ServiceNow 问题: 嵌入文档的结构不一致。主机名字段存储在不同的结构中 我需要将主机名作为u_主机名返回。如果存在,我需要$hostname.name的值;如果存在,我需要$hostname.name的值 如何确定其中一个是否存在,并将其作为u_主机名返回 结构1主机名存储为$hostnames.name {

我正在编写一个python脚本来执行以下任务:

  • 查询带有嵌入文档的MongoDB集合
  • 聚合和项目以更改查询中返回的字段名,使其与“u_”约定匹配
  • 通过RESTAPI将值导入ServiceNow
问题:

嵌入文档的结构不一致。主机名字段存储在不同的结构中

我需要将主机名作为u_主机名返回。如果存在,我需要$hostname.name的值;如果存在,我需要$hostname.name的值

如何确定其中一个是否存在,并将其作为u_主机名返回

结构1主机名存储为$hostnames.name

{
    "_id" : "192.168.1.1",
    "addresses" : {
        "ipv4" : "192.168.1.1"
    },
    "hostnames" : [ 
        {
            "type" : "PTR",
            "name" : "example.hostname.com"
        }
    ]
}
{
    "_id" : "192.168.2.1",
    "addresses" : {
        "ipv4" : "192.168.2.1"
    },
    "hostname" : "helloworld.com",

}
结构2主机名存储为$Hostname

{
    "_id" : "192.168.1.1",
    "addresses" : {
        "ipv4" : "192.168.1.1"
    },
    "hostnames" : [ 
        {
            "type" : "PTR",
            "name" : "example.hostname.com"
        }
    ]
}
{
    "_id" : "192.168.2.1",
    "addresses" : {
        "ipv4" : "192.168.2.1"
    },
    "hostname" : "helloworld.com",

}
脚本:

查询将只返回$hostname的值,而不是$hostname.name

cmp = db['computers'].aggregate([
        {"$project" : {
                "_id":0,
                "u_hostname": "$hostnames.name",
                "u_hostname": "$hostname",
                "u_ipv4": "$addresses.ipv4"
        }}
])
您可以在“主机名”字段中使用运算符


您希望在聚合函数中包含$unwind、$group和$setUnion运算符。它将允许您展平HostName.name列表,然后将它们与其他HostName合并。

HostName是一个元素数组吗?不确定我是否理解正确,但我认为“HostName”是一个对象数组。正如你在结构1中看到的,“主机名”数组包含两个属性“名称”和“类型”。数组中总是有一个对象吗?是的,我想是这样。我没有看到$HOSTNAME.name包含多个值的任何实例。版本为MongoDB 2.6.1