【问题标题】:Pymongo query on "subdocuments"Pymongo 查询“子文档”
【发布时间】:2016-12-10 20:41:16
【问题描述】:

名为groups 的集合的每个实例都有一个名为actives 的字段,它是一个“子文档”列表,即{keys: values} 形式的事物。子文档的一个字段(键)是id_,它是一个字符串。

如果我采用groups 的所有实例中存在的所有子文档的集合,则不会有两个相等的id_,即id_ 唯一标识每个子文档。但是,我得到了一个新的子文档。我需要使用子文档的 id 运行一个程序,该程序将转到网站并提取有关子文档的信息。在此信息中,我找到了子文档所属的组。但是,如果我已经有一些子文档,我不想运行这个程序,在 groups 的某些实例中,id_ 与“新”子文档相同。

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

编辑:

假设数据库组的文档是:

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

【问题讨论】:

  • 如果没有示例文档和预期的输出,您的问题很难理解。请考虑提供更多信息。
  • @Styvane 我已经编辑了我的问题。给您带来的不便深表歉意。

标签: mongodb pymongo


【解决方案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"
}

【讨论】:

    猜你喜欢
    • 2021-06-16
    • 1970-01-01
    • 2020-08-09
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 2012-12-03
    • 2013-09-12
    相关资源
    最近更新 更多