2016-12-07 8 views
0

groupsと呼ばれるコレクションの各インスタンスには、サブ文書のリストであるactivesというフィールドがあります。これは{keys:values}という形式のものです。サブ文書の1つのフィールド(キー)はid_です。これは文字列です。サブ文書のPymongoクエリ

Iはgroupsのすべてのインスタンスに存在するすべてのサブ文書のセットを取る場合は、2に等しいid_が存在しないであろう、すなわちid_一意各サブ文書を識別する。しかし、私は新しいサブ文書を取得します。私は、Webサイトに移動し、サブ文書に関する情報を抽出するサブ文書のIDを持つプログラムを実行する必要があります。この情報の中で私は、サブ文書が属するグループを見つける。しかし、私はすでにいくつかのサブ文書を持っている場合、groupsのある例では、同じ "id_"という新しいサブ文書と同じプログラムを実行したくありません。

すべての文書(または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" 
}