2017-02-22 2 views
1

У меня есть база данных MongodDB (mydbase) с различными коллекциями в ней (coll1, coll2, coll3). Я хочу собрать все документы всех коллекций в структуре списка (= базы данных) списков (= коллекций) dicts (документов) с PyMongo. Я пробовал следующее:Извлечение всех документов всех коллекций из базы данных в MongoDB с помощью PyMongo

[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({}) и формируем список с ними.

Также имейте в виду, что вы загружаете все в память. В зависимости от размера вашей базы данных это может быть не очень хорошая идея!

Смежные вопросы