Answers:
目前,MongoDB中没有命令可以执行此操作。请注意JIRA票证及相关功能要求。
您可以执行以下操作:
db.<collection_name>.find().forEach(function(d){ db.getSiblingDB('<new_database>')['<collection_name>'].insert(d); });
请注意,为此,两个数据库需要共享相同的mongod才能起作用。
除此之外,您可以从一个数据库进行集合的mongodump,然后将集合mongorestore到另一个数据库。
最好的方法是先进行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
将被保留。这样,您可以将一个数据库中的集合“追加”到另一个数据库。
在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?
其他答案更适合于复制集合,但是如果您要移动它,则特别有用。
'db1.source_collection'
我会滥用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或主机名即可连接到远程服务器。我使用它来将测试数据复制到测试数据库以进行测试。
如果在两个远程mongod实例之间,请使用
{ cloneCollection: "<collection>", from: "<hostname>", query: { <query> }, copyIndexes: <true|false> }
参见http://docs.mongodb.org/manual/reference/command/cloneCollection/
copyIndexes
选项字段实际上是不尊重。索引始终被复制。请参阅SERVER-11418
对于庞大的集合,可以使用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秒)
您可以使用聚合框架来解决您的问题
db.oldCollection.aggregate([{$out : "newCollection"}])
应该注意的是,oldCollection中的索引不会复制到newCollection中。
我知道已经回答了这个问题,但是我个人不会做@JasonMcCays的回答,因为游标会流过,如果仍在使用该集合,这可能会导致无限次游标循环。相反,我会使用snapshot():
http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database
@bens答案也是一个很好的答案,它不仅可以很好地用于集合的热备份,而且mongorestore不需要共享同一mongod。
这可能只是一个特例,但是对于具有两个随机字符串字段(长度为15-20个字符)的100k文档的集合,使用哑映射还原几乎是find-insert / copyTo的两倍:
db.coll.mapReduce(function() { emit(this._id, this); }, function(k,vs) { return vs[0]; }, { out : "coll2" })
使用pymongo,您需要将两个数据库都放在同一个mongod上,我做了以下工作:
db =原始数据库
db2 =要复制到的数据库
cursor = db["<collection to copy from>"].find()
for data in cursor:
db2["<new collection>"].insert(data)
这不会解决您的问题,但是mongodb shell具有一种copyTo
将一个集合复制到同一数据库中另一个集合的方法:
db.mycoll.copyTo('my_other_collection');
它还将BSON转换为JSON,因此mongodump
/ mongorestore
是最好的方式,正如其他人所说的。
如果某些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"
您可以随时使用Robomongo。从v0.8.3开始,有一个工具可以通过右键单击集合并选择“将集合复制到数据库”来执行此操作
有关详细信息,请参见http://blog.robomongo.org/whats-new-in-robomongo-0-8-3/
通过单击数据库,集合或特定集合下载链接,使用具有导出和导入工具的“ Studio3T for MongoDB”:https : //studio3t.com/download/
这可以使用Mongo的db.copyDatabase
方法完成:
db.copyDatabase(fromdb, todb, fromhost, username, password)
参考:http : //docs.mongodb.org/manual/reference/method/db.copyDatabase/