2016-09-30 1 views
0
  1. Я хочу скопировать полную коллекцию (например, имя «дом»).
  2. Затем выполните некоторые изменения в коллекции «home» или удалите документ внутри него (а не сборку).
  3. А потом заменить измененный «домашний» коллекцию в состояние по умолчанию из пункта 1.

делать дальше:Как скопировать одну коллекцию из MongoDB с помощью pymongo и вставить в другую пустую коллекцию?

db = client["database"] 
home = db['home'].find() # get collection. 
db['home'].remove({}) # remove doc from home 
for i in home: 
     self.db['home'].insert(i) 

Но коллекция пуста.

+0

У mongodb есть функция 'copyTo', вы можете использовать ее. [https://docs.mongodb.com/manual/reference/method/db.collection.copyTo/](https://docs.mongodb.com/manual/reference/method/db.collection.copyTo/) – gzc

+0

Но если я удалю документы из «дома», а затем скопирую их, он будет пустым. –

ответ

6

Проблема с вашим примером кода заключается в том, что find() возвращает database cursor в коллекцию, а не все документы в коллекции. Поэтому, когда вы получаете remove все документы из коллекции home, курсор также укажет на пустую коллекцию.

Чтобы скопировать коллекцию в другую коллекцию в том же сервере, вы можете использовать MongoDB Aggregation оператор $match и $out

pipeline = [ {"$match": {}}, 
      {"$out": "destination_collection"}, 
] 
db.source_collection.aggregate(pipeline) 

Используя ваш пример кода, теперь вы можете сделать

source = db["source_collection"] 
destination = db["destination_collection"] 

# Remove all documents, or make modifications. 
source.remove({}) 

# Restore documents from the source collection. 
for doc in destination: 
     source.insert(doc) 
# or instead you can just use the same aggregation method above but reverse the collection name. 

Примечание: db.collection.copyTo() устарел, так как MongoDB v3.0.

Если вы хотите скопировать на другой сервер MongoDB, вы можете использовать db.cloneCollection(). В PyMongo это будет команда, например ниже:

db.command("cloneCollection", **{'collection': "databaseName.source_collection", 'from': "another_host:another_port"}) 

В зависимости от вашей общей цели, вы можете найти MongoDB BackUp methods полезным.

+0

Большое вам спасибо. Помогает –

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

  • Нет связанных вопросов^_^