2016-12-07 112 views
0

名为groups的集合的每个实例都有一个名为actives的字段,它是“子文档”的列表,即形式为{键:值}的东西。子文档的一个字段(键)是id_,它是一个字符串。Pymongo查询“子文档”

如果我参加该组存在于groups所有实例所有子文档,那么不会有2个相等id_,即id_唯一地标识每个子文档。但是,我得到一个新的子文档。我需要运行一个带有子文档ID的程序,该程序会去一个网站并提取有关子文档的信息。在这个信息中,我找到了该子文档所属的组。但是,如果我已经有了一些子文档,在groups的与“新”子文档相同的情况下,我不想运行此程序。

如何列出所有文档(或groups的实例)的所有子文档的ID?

编辑:

假设DB组的文件是:

doc1: {"neighbourhood": "n1", "actives": [{"id_": "MHTEQ", "info": "a_long_string"}, {"id_": "PNPQA", "info": "a_long_string"}]} 

doc2: {"neighbourhood": "n2", "actives": [{"id_": "MERVX", "info": "a_long_string"}, {"id_": "ZDKJW", "info": "a_long_string"}]} 

我想要做的是列出所有的"id_",即

def list_ids(groups): 
    do_sth_with_groups 
    return a_list 

print(list_ids(groups)) 

output: ["MHTEQ", "PNPQA", "MERVX", "ZDKJW"] 
+3

你提的问题是很难不样本文件和预期输出理解。请考虑提供更多信息。 – styvane

+0

@Styvane我编辑了我的问题。不便之处,敬请原谅。 –

回答

1

使用聚合管道与$unwind$project运营商。

results = db['collection'].aggregate(
    [ 
    {"$project": {"actives": 1, "_id": 0}}, 
    {"$unwind": "$actives"}, 
    {"$project": {"id_str": "$actives.id_", "_id": 0}} 
    ] 
) 
return list(results) 

https://docs.mongodb.com/v3.2/reference/operator/aggregation/unwind/ https://docs.mongodb.com/v3.2/reference/operator/aggregation/project/

样本输出

{ 
    "id_str" : "MHTEQ" 
} 
{ 
    "id_str" : "PNPQA" 
} 
{ 
    "id_str" : "MERVX" 
} 
{ 
    "id_str" : "ZDKJW" 
}