如何用Python遍历MongoDB中的嵌套对象列表?附代码示例
遍历MongoDB返回的嵌套对象列表
看起来你已经成功从MongoDB获取到包含嵌套links数组的文档了,接下来遍历这个嵌套列表其实很简单,我来帮你梳理两种实现方式:
方式一:基于你现有的fetch_links方法处理返回结果
你的fetch_links方法返回的是一个文档列表(哪怕只匹配到一条数据,也会被包裹在列表里),而每个文档中的links字段才是我们需要遍历的嵌套对象列表。你可以这样处理:
old_links = Signatures.fetch_links(web_id) # 遍历外层的文档列表(find返回的游标转成列表后是多个文档的集合) for document in old_links: # 提取当前文档中的links列表,用get方法避免字段不存在时抛出KeyError links_collection = document.get('links', []) # 遍历每个嵌套的link对象 for link_item in links_collection: # 访问每个link的属性,比如type、link_id、link print(f"Link类型: {link_item['type']}") print(f"Link ID: {link_item['link_id']}") print(f"Link地址: {link_item['link']}") # 这里可以添加你的业务处理逻辑,比如存储、校验等
方式二:优化fetch_links方法,简化后续遍历
因为你是通过_id查询文档(MongoDB中_id是唯一的),所以查询结果最多只有一条文档。可以用find_one替代find,直接返回单个文档,这样我们可以在方法内部直接提取links列表,让调用方的代码更简洁:
优化后的类方法
@classmethod def fetch_links(cls, web_id): # 使用find_one直接获取匹配的单个文档,无需转换为列表 target_doc = cls.db.websites.find_one({"_id": ObjectId(web_id)}, {"links": 1}) # 如果文档存在,返回links列表;否则返回空列表避免后续报错 return target_doc.get('links', []) if target_doc else []
调用并遍历的代码
old_links = Signatures.fetch_links(web_id) # 现在old_links直接就是links对象的列表,直接遍历即可 for link_item in old_links: print(f"Type: {link_item['type']}, Link ID: {link_item['link_id']}, URL: {link_item['link']}")
两种方式都能实现你的需求,第二种方式更贴合_id查询的唯一性场景,代码也更简洁。根据你的实际业务场景选择就好~
内容的提问来源于stack exchange,提问作者bhattraideb
相关产品推荐
相关产品推荐

