【问题标题】:Retrieving all documents of all collections from a database in MongoDB with PyMongo使用 PyMongo 从 MongoDB 中的数据库中检索所有集合的所有文档
【发布时间】:2017-02-22 12:43:36
【问题描述】:
我有一个 MongodDB 数据库 (mydbase),其中包含不同的集合 (coll1、coll2、coll3)。我想用 PyMongo 收集字典(文档)列表(=集合)的列表(=数据库)结构中的所有集合的所有文档。我尝试了以下方法:
[list(db.coll.find({})) for coll in db.collection_names()]
但它返回一个空列表列表。这有点奇怪,因为如果我以类似的方式只查询一个集合:
list(db.coll1.find({}))
给出了所希望的填充列表。这里有什么问题?
【问题讨论】:
标签:
python
mongodb
pymongo
【解决方案1】:
test = [ list(db[coll].find({})) for coll in db.collection_names() ]
coll是一个变量,所以我们需要使用db[coll]而不是db.coll
例如,对于具有名为 'knights' 的集合的数据库
db.knights.find_one({}) # correctly from 'knights'
n = 'knights'
db.n.find_one({}) # get one document from 'n'
db[n].find_one({}) # correctly from 'knights'
db['n'].find_one({}) # from 'n' again
【解决方案2】:
你可以用这个:
[[record for record in db[collection_name].find({})] for collection_name in db.collection_names()]
我会这样读:
[something for collection_name in db.collection_names()]
我们使用db.collection_names() 来获得一个表示数据库中集合名称的可迭代对象。
然后我们遍历该可迭代对象,将当前集合名称放入变量collection_name。使用 collection_name 变量,我们可以使用 something。
这将形成您想要的结果的外部列表。
现在,让我们解决内部列表。
[record for record in db[collection_name].find({})]
首先,让我们识别可迭代对象。即db[collection_name].find({})。它是两者的结合,db[collection_name] 访问集合,.find({}) 获取可迭代对象。
使用collection_name 变量,我们从外部列表访问当前集合。我们可以将db[collection_name] 视为我们从中提取记录的当前集合。
从该集合中,我们找到所有记录 .find({}) 并与它们形成一个列表。
另外,请记住,您正在将所有内容加载到内存中。根据您数据库的大小,这可能不是一个好主意!