2017-02-22 45 views
1

我有一个MongodDB数据库(mydbase),其中包含不同的集合(coll1,coll2,coll3)。我想用PyMongo来收集所有集合的所有文档的列表(=数据库)列表(=集合)的字典(文档)的结构中的所有集合。我试过以下内容:使用PyMongo从MongoDB中的数据库中检索所有集合的所有文档

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

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

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

给出了一个填充列表,如希望的那样。这里有什么问题?

回答

2
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 
0

您可以使用此集合:

[[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({})并与它们形成一个列表。

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

相关问题