Python 将不同的嵌入式结构投影到相同的名称
我正在编写一个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 {
- 查询带有嵌入文档的MongoDB集合
- 聚合和项目以更改查询中返回的字段名,使其与“u_”约定匹配
- 通过RESTAPI将值导入ServiceNow
{
"_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