如何在MongoDB中将集合从一个数据库复制到另一个数据库

有一个简单的方法来做到这一点?

目前在MongoDB中没有这样做的命令。 请注意带有相关function请求的JIRA票证 。

你可以做这样的事情:

db.<collection_name>.find().forEach(function(d){ db.getSiblingDB('<new_database>')['<collection_name>'].insert(d); }); 

请注意,有了这个,两个数据库将需要共享相同的mongod才能工作。

除此之外,您可以从一个数据库中执行一个集合的mongodump,然后将该集合mongorestore存储到另一个数据库中。

最好的办法是做一个mongodump然后mongorestore。

您可以通过以下方式select集合:

 mongodump -d some_database -c some_collection 

[可选地,压缩转储( zip some_database.zip some_database/* -r )并在其他地方使用scp ]

然后恢复它:

 mongorestore -d some_other_db -c some_or_other_collection dump/some_collection.bson 

some_or_other_collection现有数据将被保留。 这样你可以将一个数据库中的集合“附加”到另一个数据库中。

在版本2.4.3之前,在复制数据之后,还需要添加索引。 从2.4.3开始,这个过程是自动的,你可以用--noIndexRestore来禁用它。

实际上,有一个命令一个数据库从一个数据库移到另一个数据库。 这只是不叫“移动”或“复制”。

要复制一个集合,可以将它复制到同一个数据库中,然后移动该复制。

克隆:

 > use db1 > db.source_collection.find().forEach( function(x){db.collection_copy.insert(x)} ); 

移动:

 > use admin switched to db admin > db.runCommand({renameCollection: 'db1.source_collection', to: 'db2.target_collection'}) // who'd think rename could move? 

其他答案是更好的复制集合,但是这是特别有用的,如果你想要移动它。

我会滥用mongo cli mongo doc中的连接function。 这意味着您可以启动一个或多个连接。 如果你想在同一台服务器上将客户收集从testing复制到test2。 首先你启动mongo shell

 use test var db2 = connect('localhost:27017/test2') 

做一个正常的查找并将第20条logging复制到test2。

 db.customer.find().limit(20).forEach(function(p) { db2.customer.insert(p); }); 

或通过一些标准过滤

 db.customer.find({"active": 1}).forEach(function(p) { db2.customer.insert(p); }); 

只需将本地主机更改为IP或主机名即可连接到远程服务器。 我用它来将testing数据复制到testing数据库进行testing。

我通常会这样做:

 use sourcedatabase; var docs=db.sourcetable.find(); use targetdatabase; docs.forEach(function(doc) { db.targettable.insert(doc); }); 

如果在两个远程mongod实例之间,使用

 { cloneCollection: "<collection>", from: "<hostname>", query: { <query> }, copyIndexes: <true|false> } 

http://docs.mongodb.org/manual/reference/command/cloneCollection/

我知道这个问题已经回答了,但是我个人不会这样做@JasonMcCays答案,因为游标stream,这可能会导致一个无限的游标循环,如果集合仍在使用。 相反,我会使用快照():

http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database

@bens的回答也是一个很好的回答,不仅适用于热门的备份,而且mongorestore也不需要共享同一个mongod。

这可能只是一个特殊情况,但对于具有两个随机string字段(长度为15-20个字符)的100k文档集合,使用哑映射的速度几乎是find-insert / copyTo的两倍:

 db.coll.mapReduce(function() { emit(this._id, this); }, function(k,vs) { return vs[0]; }, { out : "coll2" }) 

您可以使用聚合框架来解决您的问题

 db.oldCollection.aggregate([{$out : "newCollection"}]) 

需要注意的是,oldCollection中的索引不会被复制到newCollection中。

这不会解决你的问题,但是mongodb shell有一个copyTo方法,可以将集合复制到另一个数据库中

 db.mycoll.copyTo('my_other_collection'); 

它也从BSON翻译成JSON,所以mongodump / mongorestore是其他人所说的最好的方法。

如果一些heroku用户在这里磕磕绊绊,像我想从临时数据库复制一些数据到生产数据库,反之亦然,这是你如何非常方便地做到这一点(注意,我希望没有错别字,不能检查它,我会尽快确认代码的有效性):

 to_app="The name of the app you want to migrate data to" from_app="The name of the app you want to migrate data from" collection="the collection you want to copy" mongohq_url=`heroku config:get --app "$to_app" MONGOHQ_URL` parts=(`echo $mongohq_url | sed "s_mongodb://heroku:__" | sed "s_[@/]_ _g"`) to_token=${parts[0]}; to_url=${parts[1]}; to_db=${parts[2]} mongohq_url=`heroku config:get --app "$from_app" MONGOHQ_URL` parts=(`echo $mongohq_url | sed "s_mongodb://heroku:__" | sed "s_[@/]_ _g"`) from_token=${parts[0]}; from_url=${parts[1]}; from_db=${parts[2]} mongodump -h "$from_url" -u heroku -d "$from_db" -p"$from_token" -c "$collection" -o col_dump mongorestore -h "$prod_url" -u heroku -d "$to_app" -p"$to_token" --dir col_dump/"$col_dump"/$collection".bson -c "$collection" 

这可以使用Mongo的db.copyDatabase方法完成:

 db.copyDatabase(fromdb, todb, fromhost, username, password) 

参考: http : //docs.mongodb.org/manual/reference/method/db.copyDatabase/

你总是可以使用Robomongo。 从v0.8.3开始,有一个工具可以通过右键单击集合并select“Copy Collection to Database”

有关详情,请参阅http://blog.robomongo.org/whats-new-in-robomongo-0-8-3/

这个特性在0.8.5版本中被删除了,因为它有错误的特性,所以如果你想试试,你将不得不使用0.8.3或者0.8.4。

使用pymongo,你需要有两个数据库在同一个mongod,我做了以下几点:


db =原始数据库
db2 =要复制到的数据库

 cursor = db["<collection to copy from>"].find() for data in cursor: db2["<new collection>"].insert(data) 

在我的情况下,我不得不在我的新集合中使用旧集合中的一部分属性。 所以我最终select这些属性,同时调用插入新的集合。

 db.<sourceColl>.find().forEach(function(doc) { db.<newColl>.insert({ "new_field1":doc.field1, "new_field2":doc.field2, .... }) });`