我有一个MongodDB数据库(mydbase),其中包含不同的集合(coll1,coll2,coll3)。我想用PyMongo收集dicts(文档)列表(= collections)列表(=数据库)结构中所有集合的所有文档。我尝试了以下方法:
[list(db.coll.find({})) for coll in db.collection_names()]
但它返回一个空列表列表。这有点奇怪,因为如果我以类似的方式只查询一个集合:
list(db.coll1.find({}))
给出了希望填充的列表。这有什么问题?
答案 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({})
并与它们形成一个列表。
另外,请记住,您正在将所有内容加载到内存中。根据数据库的大小,这可能不是一个好主意!