【问题标题】:How can I copy one collection from MongoDB using pymongo and paste to another empty collection?如何使用 pymongo 从 MongoDB 复制一个集合并粘贴到另一个空集合?
【发布时间】:2017-02-08 20:43:14
【问题描述】:
  1. 我想复制完整的收藏(例如名称“家”)。
  2. 然后在“home”集合中进行一些更改或删除其中的 doc(不是集合)。
  3. 然后将更改的“主页”集合从第 1 项替换为其默认状态。

接下来我做:

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)

但是集合是空的。

【问题讨论】:

标签: python mongodb pymongo


【解决方案1】:

您的代码示例的问题是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 很有用。

【讨论】:

  • 我认为应该反过来。对于源中的文档:destination.insert(doc)
  • 第 3 步的问题是将其恢复到原来的源集合,源被删除之后。如果您只是从源移动到目标,则可以使用 $out 聚合管道并在该阶段停止。
【解决方案2】:

这可能是最简单的方法,我个人更喜欢它,因此您可以添加任意数量的过滤器:

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')

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 2021-06-14
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 2021-10-27
    • 2021-02-01
    相关资源
    最近更新 更多