Mongodb文档遍历

2024-09-27 07:16:50 发布

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

我在mongodb中有一个查询,尝试了很多解决方案,但仍然没有找到它的工作。任何帮助都将不胜感激。你知道吗

如何在文档中找到所有名为“channel”的键?你知道吗

db.clients.find({"_id": 69})

{
    "_id" : 69,
    "configs" : {
        "GOOGLE" : {
            "drid" : "1246ABCD",
            "adproviders" : {
                "adult" : [ 
                    {
                        "type" : "landing",
                        "adprovider" : "abc123",
                        "channel" : "abc456"
                    }, 
                    {
                        "type" : "search",
                        "adprovider" : "xyz123",
                        "channel" : "xyz456"
                    }
                ],
                "nonadult" : [ 
                    {
                        "type" : "landing",
                        "adprovider" : "pqr123",
                        "channel" : "pqr456"
                    }, 
                    {
                        "type" : "search",
                        "adprovider" : "lmn123",
                        "channel" : "lmn456"
                    }
                ]
            }
        },
        "channel" : "ABC786",
        "_cls" : "ClientGoogleDoc"
    }
}

正在尝试查找名为channel的键

db.clients.find({"_id": 69, "channel": true})

期望值:

{"channels": ["abc456", "xyz456", "ABC786", "xyz456", "pqr456", "lmn456", ...]}

Tags: iddbsearchmongodbtypechannelfindclients
2条回答

可以使用$projectmongodb操作符仅获取特定键的值。查看http://docs.mongodb.org/manual/reference/operator/aggregation/project/上的文档

据我所知,您必须自己使用python递归遍历字典,以便构建上面所需的列表:

channels = []

def traverse(my_dict):
    for key, value in my_dict.items():
        if isinstance(value, dict):
            traverse(value)
        else:
            if key == "channel":
                channels.append(value)

traverse({"a":{"channel":"abc123"}, "channel":"xyzzz"})  
print(channels)

输出:

['abc123', 'xyzzz']

但是,使用一个名为projections的东西,您可以得到接近您想要的结果(但不是真的,因为您必须手动指定所有通道):

db.clients.find({"_id": 69}, {"configs.channel":1})

退货:

{ "_id" : ObjectId("69"), "configs" : { "channel" : "ABC786" } }

如果您真的想玩,可以编写一个generator函数来生成给定字典中的所有键,不管它有多深:

my_dict = { "a": {
                "channel":"abc123",
                "key2": "jjj",
                "subdict": {"deep_key": 5, "channel": "nested"}
            }, 
            "channel":"xyzzz"}

def getAllKeys(my_dict):
    for key, value in my_dict.items():
        yield key, value
        if isinstance(value, dict):
            for key, value in getAllKeys(value):
                yield key, value

for key, value in getAllKeys(my_dict):
    if key == "channel":
        print value

输出:

nested
abc123
xyzzz

相关问题 更多 >

    热门问题