如何使用pymongo从MongoDB复制一个集合并粘贴到另一个空集合?

时间:2016-09-30 09:53:32

标签: python mongodb pymongo

  1. 我想复制完整的收藏品(例如姓名' home')。
  2. 然后在“家”中做一些改变。收集或删除其中的doc(不是集合)。
  3. 然后更换已更改的' home'从项目1收集到其默认状态。
  4. 我接下来会这样做:

    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)
    

    但收藏品是空的。

2 个答案:

答案 0 :(得分:8)

您的代码示例的问题是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. 

注意:自MongoDB v3.0以来已弃用db.collection.copyTo()

如果要复制到另一台MongoDB服务器,可以使用db.cloneCollection()。在PyMongo中,它将是如下命令:

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

根据您的总体目标,您可能会发现MongoDB BackUp methods非常有用。

答案 1 :(得分:0)

这可能是最简单的方法,我个人比较喜欢,因此您可以随意添加过滤器:

    from pymongo import MongoClient

    def CopyFromColl1ToColl2(database1,collection1,database2,collection2):

    db1 = MongoClient('mongodb://127.0.0.1:27017')[database1][collection1]
    db2 = MongoClient('mongodb://127.0.0.1:27017')[database2][collection2]
    #here you can put the filters you like.
    for a in db1.find():
        try:
            db2.insert(a)
            print(a)
        except:
            print('did not copy')

#you can choose the database name and the collection name
CopyFromColl1ToColl2('database1','collection1','database2','collection2')