2016-07-06 111 views
4

我写执行这些任务的python脚本:与嵌入式文件 项目不同的嵌入式结构,以相同的名称

  • 总结和项目,以改变在返回的字段名

    • 查询一个MongoDB的集合查询匹配 “U_” 公约
    • 进口值通过REST API来的ServiceNow

    问题:

    嵌入式文档的结构不一致。 HOSTNAME字段存储在不同的结构中。

    我需要将主机名作为u_hostname返回。如果它存在,我需要$ hostnames.name的值,如果存在,则需要$ hostname的值。

    如何确定是否存在任何一个,并将其作为u_hostname返回?

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

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

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

    { 
        "_id" : "192.168.2.1", 
        "addresses" : { 
         "ipv4" : "192.168.2.1" 
        }, 
        "hostname" : "helloworld.com", 
    
    } 
    

    脚本:

    查询时仅会返回$ host的值名称,而不是$ hostname.name。

    cmp = db['computers'].aggregate([ 
         {"$project" : { 
           "_id":0, 
           "u_hostname": "$hostnames.name", 
           "u_hostname": "$hostname", 
           "u_ipv4": "$addresses.ipv4" 
         }} 
    ]) 
    
  • +0

    “主机名”是一个元素数组吗? – styvane

    +0

    不知道我是否理解正确,但我认为“主机名”是一组对象。正如您在结构1中看到的,“主机名”数组包含两个属性“名称”和“类型”。 – pengz

    +0

    你总是有一个对象在数组中? – styvane

    回答

    1

    可以使用$ifNull运营商$project “主机名” 字段。

    cmp = db['computers'].aggregate([ 
        {"$project": { 
         "u_hostname": { 
          "$ifNull": [ 
           "$hostnames.name", 
           { "$map": { 
            "input": {"$literal": ["A"]}, 
            "as": "el", 
            "in": "$hostname" 
           }} 
          ] 
         }, 
         "_id": 0, 
         "u_ipv4": "$addresses.ipv4" 
        }}, 
        {"$unwind": "$u_hostname"} 
    ]) 
    
    1

    您希望集合函数中包含$ unwind,$ group和$ setUnion运算符。它将允许你压扁hostnames.name列表,然后将它们与其他主机名进行合并。

    相关问题