MongoDB 2.6中preserveNullandEmptyArray的解决方案

2024-05-23 18:32:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Python脚本查询MongoDB集合。集合包含具有不同结构的嵌入文档。在

我试图简单地“$unfind”包含在多个文档中的数组。但是,数组并不是在所有文档中。在

这意味着只返回包含该字段的文档,其他文档将被忽略。我使用的是pymongo2.6,所以我无法使用preserveNullAndEmptyArrays,因为它是mongodb3.2中的新功能

有解决办法吗?沿着“如果磁场路径存在,就展开”这句话。在

关于文档和代码的结构在这个单独的但是我之前问过的related question中有详细的概述。在

问题:

我正在尝试“$unfind”值$hostnames.name。但是,由于路径并不存在于所有文档中,这将导致多个被忽略的文档。在

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

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

结构2主机名存储为$Hostname

^{pr2}$

脚本

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"}
])

我缺少所有“主机名”数组为空的文档。在

这是仍然丢失的文件的结构。在

结构3

{
   "_id" : "192.168.1.1",
    "addresses" : { "ipv4" : "192.168.1.1" },
    "hostnames" : [], }
}

Tags: name文档路径脚本idmongodbaddresses数组
1条回答
网友
1楼 · 发布于 2024-05-23 18:32:24

我们仍然可以通过使用^{}运算符来保留所有缺少数组字段的文档,并使用逻辑^{}处理为新计算的字段赋值。在

这里的条件是^{},如果字段是[None],则返回True;如果条件表达式的计算结果为False,则返回False。在

cmp = db['computers'].aggregate(
    [
        {"$project":{ 
            "u_ipv4": "$addresses.ipv4",
            "u_hostname": {
                "$let": {
                    "vars": {
                        "hostnameName": {
                            "$cond": [
                                {"$eq": ["$hostnames", []]},
                                [None], 
                                {"$ifNull": ["$hostnames.name", [None]]}
                            ]
                        }, 
                        "hostname": {"$ifNull": ["$hostname", None]}
                    }, 
                    "in": {
                        "$cond": [ 
                            {"$eq": ["$$hostnameName", [None]]}, 
                            {"$map": {
                                "input": {"$literal": [None]}, 
                                "as": "el", 
                                "in": "$$hostname"
                            }}, 
                            "$$hostnameName"
                        ]
                    }
                }
            }
        }},        
        { "$unwind": "$u_hostname" }
    ]
)

相关问题 更多 >