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

有什么简单的方法吗?

244594 次浏览

最好的方法是先mongodumpmongorestore。您可以通过以下方式选择集合:

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禁用它。

目前,MongoDB中还没有这样的命令。请注意带有相关功能请求的JIRA票据

你可以这样做:

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

请注意,在这种情况下,两个数据库需要共享同一个mongod才能正常工作。

除此之外,您还可以从一个数据库对一个集合进行mongodump,然后再将该集合恢复到另一个数据库。

我知道这个问题已经被回答了,但我个人不会做@JasonMcCays的回答,因为光标流的事实,这可能会导致无限的游标循环,如果集合仍在使用。相反,我将使用snapshot():

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

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

我会滥用mongo cli 蒙戈医生中的连接函数。这意味着您可以启动一个或多个连接。 如果您想将客户集合从test复制到同一服务器中的test2。首先你启动mongo shell

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

执行常规查找并将前20条记录复制到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); });

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

实际上,有一个命令移动从一个数据库到另一个数据库的集合。只是不叫“move”。或“;copy"。

若要复制集合,可以在同一数据库上克隆它,然后移动克隆的集合。

克隆:

> use db1
switched to db 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'
}
);

其他答案更适合复制集合,但如果您希望移动集合,这个答案尤其有用。

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

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

我通常会这样做:

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

这并不能解决你的问题,但是mongodb shell有一个copyTo方法,它将一个集合复制到另一个在同一个数据库中中:

db.mycoll.copyTo('my_other_collection');

它还可以从BSON转换为JSON,所以正如其他人所说,mongodump/mongorestore是最好的方式。

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

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

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

你可以随时使用Robomongo。从v0.8.3开始,有一个工具可以通过右键单击集合并选择“将集合复制到数据库”来完成此操作。

详情请参见http://blog.robomongo.org/whats-new-in-robomongo-0-8-3/

这个特性是在0.8.5移除,由于它的bug性质,所以如果你想尝试它,你将不得不使用0.8.3或0.8.4。

以防一些heroku用户在这里遇到麻烦,像我一样想从登台数据库复制一些数据到生产数据库,反之亦然,这里是如何非常方便地做到这一点(注意,我希望没有错字在那里,不能检查它atm。,我会尽快确认代码的有效性):

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/

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

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

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

在我的例子中,我必须在新集合中使用旧集合中的属性子集。因此,我最终在对新集合调用insert时选择了这些属性。

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

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


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

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

如果RAM不是问题,使用insertManyforEach循环快得多。

var db1 = connect('<ip_1>:<port_1>/<db_name_1>')
var db2 = connect('<ip_2>:<port_2>/<db_name_2>')


var _list = db1.getCollection('collection_to_copy_from').find({})
db2.collection_to_copy_to.insertMany(_list.toArray())

对于大型集合,可以使用Bulk.insert ()

var bulk = db.getSiblingDB(dbName)[targetCollectionName].initializeUnorderedBulkOp();
db.getCollection(sourceCollectionName).find().forEach(function (d) {
bulk.insert(d);
});
bulk.execute();

将保存很多时候。 在我的情况下,我复制集合与1219个文档:iter vs Bulk(67秒vs 3秒)

使用“Studio3T for MongoDB” 通过单击数据库,集合或特定的集合具有导出和导入工具 https://studio3t.com/download/

.下载链接

有不同的方法来进行集合复制。注意复制可以发生在同一个数据库、不同的数据库、分片数据库或mongod实例中。有些工具对于大型集合的复制是有效的。

聚合$merge: 将聚合管道的结果写入指定的集合。注意,复制可以跨数据库进行,甚至可以跨分片集合进行。创建一个新的集合或替换现有的集合。4.2新版功能。 例如:db.test.aggregate([ { $merge: { db: "newdb", coll: "newcoll" }} ]) < / p >

聚合$out: 将聚合管道的结果写入指定的集合。注意,复制只能在同一个数据库中进行。创建一个新的集合或替换现有的集合。 例如:db.test.aggregate([ { $out: "newcoll" } ]) < / p >

mongoexport and mongoimport: 这些是命令行工具。 mongoexport生成收集数据的JSON或CSV导出。导出的输出使用mongoimport.

. 0作为目标集合的源

mongodb和mongorestore: 这些是命令行工具。 mongodump实用程序用于创建数据库或集合内容的二进制导出。mongorestore程序将由mongodump创建的二进制数据库转储中的数据加载到目标

< >强db.cloneCollection (): 将一个集合从远程mongod实例复制到当前mongod实例。 4.2版后已移除

< >强db.collection.copyTo (): 将所有文档从集合复制到新集合(在同一数据库中)。 3.0版后已移除。从4.2版开始,MongoDB这个命令是无效的

注意: Unless表示上述命令从mongo shell运行。

参考: MongoDB手册

您也可以使用最喜欢的编程语言(如Java)或环境(如NodeJS),使用适当的驱动程序软件编写程序来执行复制-这可能涉及使用查找和插入操作或其他方法。这个find-insert也可以从mongo shell中执行。

您还可以使用像MongoDB Compass这样的GUI程序进行集合复制。

令人难以置信的是,对于缓慢得令人痛苦的一份一份的数据拷贝,有多少人投了赞成票。

正如给出的其他答案,最快的解决方案应该是mongodump / mongorestore。不需要将转储文件保存到本地磁盘,您可以将转储文件直接管道到mongorestore:

mongodump --db=some_database --collection=some_collection --archive=- | mongorestore --nsFrom="some_database.some_collection" --nsTo="some_or_other_database.some_or_other_collection" --archive=-

如果您运行一个分片集群,默认情况下新集合是不分片的。所有数据最初都写入主分片。这可能会导致磁盘空间问题,并为您的集群平衡增加额外的负载。更好的预裂你的集合在你导入数据之前是这样的:

sh.shardCollection("same_or_other_database.same_or_other_collection", { <shard_key>: 1 });
db.getSiblingDB("config").getCollection("chunks").aggregate([
{ $match: { ns: "some_database.some_collection"} },
{ $sort: { min: 1 } },
{ $skip: 1 }
], { allowDiskUse: true }).forEach(function (chunk) {
sh.splitAt("same_or_other_database.same_or_other_collection", chunk.min)
})

在MongoDB中将一个集合(myCollection1)从一个数据库复制到另一个数据库,

**Server1:**
myHost1.com
myDbUser1
myDbPasword1
myDb1
myCollection1


outputfile:
myfile.json


**Server2:**
myHost2.com
myDbUser2
myDbPasword2
myDb2
myCollection2

你可以这样做:

mongoexport  --host myHost1.com --db myDb1 -u myDbUser1  -p myDbPasword1 --collection myCollection1   --out  myfile.json

然后:

mongoimport  --host myHost2.com --db myDb2 -u myDbUser2  -p myDbPasword2 --collection myCollection2   --file myfile.json

另一种情况,使用CSV文件:

Server1:
myHost1.com
myDbUser1
myDbPasword1
myDb1
myCollection1
fields.txt
fieldName1
fieldName2


outputfile:
myfile.csv


Server2:
myHost2.com
myDbUser2
myDbPasword2
myDb2
myCollection2

你可以这样做:

mongoexport  --host myHost1.com --db myDb1 -u myDbUser1  -p myDbPasword1 --collection myCollection1   --out  myfile.csv --type=csv

在CSV文件中添加列类型(name1.decimal(),name1.string()..),然后:

mongoimport  --host myHost2.com --db myDb2 -u myDbUser2  -p myDbPasword2 --collection myCollection2   --file myfile.csv --type csv --headerline --columnsHaveTypes

这里有很多正确答案。对于大型集合,我会以管道方式使用mongodumpmongorestore:

mongodump --db fromDB --gzip --archive | mongorestore --drop --gzip --archive --nsFrom "fromDB.collectionName" --nsTo "toDB.collectionName"

虽然如果我想快速复制,它很慢,但它是有效的:

use fromDB
db.collectionName.find().forEach(function(x){
db.getSiblingDB('toDB')['collectionName'].insert(x);
});"

从现有的MongoDB atlas cluster DB导入数据最简单的方法是使用mongodump &mongorestore命令。

要从现有的DB中创建转储,您可以使用:

mongodump --uri="<connection-uri>"

还有其他可以在这里查找的连接选项:https://www.mongodb.com/docs/database-tools/mongodump/

在dump/目录中成功创建转储后,您可以使用导入数据到您的其他db,如下所示:

mongorestore --uri="<connection-uri-of-other-db>" <dump-file-location>
与mongorestore类似,还有其他连接选项,可以在命令中查找以恢复特定的集合: https://www.mongodb.com/docs/database-tools/mongorestore/ < / p >

转储文件的位置将在转储目录中。可能存在与您转储的DB名称相同的子目录。例如,如果您转储了测试数据库,那么转储文件的位置将是/dump/test