使用PyMongo从MongoDB中的数据库中检索所有集合的所有文档

时间:2017-02-22 12:43:36

标签: python mongodb pymongo

我有一个MongodDB数据库(mydbase),其中包含不同的集合(coll1,coll2,coll3)。我想用PyMongo收集dicts(文档)列表(= collections)列表(=数据库)结构中所有集合的所有文档。我尝试了以下方法:

[list(db.coll.find({})) for coll in db.collection_names()]

但它返回一个空列表列表。这有点奇怪,因为如果我以类似的方式只查询一个集合:

list(db.coll1.find({}))

给出了希望填充的列表。这有什么问题?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

你可以用这个:

[[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()来获取表示数据库中集合名称的iterable。

然后我们遍历该iterable,将当前集合名称放在变量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({})并与它们形成一个列表。

另外,请记住,您正在将所有内容加载到内存中。根据数据库的大小,这可能不是一个好主意!