.db怎么复制到java里_如何在MongoDB中将集合从一个数据库复制到另一个数据库

回答(17)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

你可以这样做:

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

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

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

最好的方法是做一个mongodump然后mongorestore .

您可以通过以下方式选择集合:

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 中的现有数据将被保留 . 这样你就可以_A64155_从一个数据库到另一个数据库的集合 .

在2.4.3版之前,您还需要在复制数据后添加索引 . 从2.4.3开始,此过程是自动的,您可以使用 --noIndexRestore 禁用它 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

实际上,有一个命令 move 从一个数据库到另一个数据库的集合 . 它只是没有被称为"move"或"copy" .

要复制集合,可以在同一个db上克隆它,然后移动克隆 .

要克隆:

> 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?

其他答案更适合复制集合,但如果您想要移动它,这尤其有用 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我会滥用mongo cli mongo doc中的connect函数 . 这意味着您可以启动一个或多个连接 . 如果要将客户集合从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或主机名即可连接到远程服务器 . 我用它将测试数据复制到测试数据库进行测试 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

{ cloneCollection: "", from: "", query: { }, copyIndexes: }

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我通常会这样做:

use sourcedatabase;

var docs=db.sourcetable.find();

use targetdatabase;

docs.forEach(function(doc) { db.targettable.insert(doc); });

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

@bens答案也是一个很好的答案,适用于集合的热备份,不仅如此,但mongorestore不需要共享相同的mongod .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

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

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

db =原始数据库

db2 =要复制到的数据库

cursor = db[""].find()

for data in cursor:

db2[""].insert(data)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

db.mycoll.copyTo('my_other_collection');

它也从BSON转换为JSON,所以 mongodump / mongorestore 是最好的方式,正如其他人所说的那样 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

如果一些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"

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

这个功能由于它的错误特性而removed in 0.8.5所以如果你想尝试它,你将不得不使用0.8.3或0.8.4 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

如果RAM不是问题,使用 insertMany 比 forEach 循环更快 .

var db1 = connect(':/')

var db2 = connect(':/')

var _list = db1.getCollection('collection_to_copy_from').find({})

db2.collection_to_copy_to.insertMany(_list.toArray())

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

对于大尺寸的集合,你可以使用Bulk.insert()

var bulk = db.getSiblingDB(dbName)[targetCollectionName].initializeUnorderedBulkOp();

db.getCollection(sourceCollectionName).find().forEach(function (d) {

bulk.insert(d);

});

bulk.execute();

这将节省 a lot of time . 在我的情况下,我正在使用1219个文件复制集合:iter vs Bulk(67秒vs 3秒)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

就我而言,我必须在新集合中使用旧集合中的一部分属性 . 所以我在调用新集合上的insert时最终选择了这些属性 .

db..find().forEach(function(doc) {

db..insert({

"new_field1":doc.field1,

"new_field2":doc.field2,

....

})

});`

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值