活泼的石榴 · 如何在WPF应用程序中实现类似浏览器中文本框 ...· 11 月前 · |
耍酷的书包 · Sysmon - Sysinternals ...· 1 年前 · |
朝气蓬勃的豌豆 · SQL 语法--湖仓一体分析服务 LAS-火山引擎· 1 年前 · |
私奔的山楂 · 从嵌套列表中提取JSON值· 1 年前 · |
不爱学习的火腿肠 · RabbitMQ入门Demo,基于sprin ...· 1 年前 · |
有没有简单的方法可以做到这一点?
最好的方法是先做
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
禁用它。
目前,在MongoDB中还没有命令可以做到这一点。请注意 JIRA ticket with related feature request 。
你可以这样做:
db.<collection_name>.find().forEach(function(d){ db.getSiblingDB('<new_database>')['<collection_name>'].insert(d); });
请注意,有了这个,两个数据库需要共享相同的神灵才能正常工作。
除此之外,您还可以对一个数据库中的集合执行mongodump操作,然后将集合mongodump恢复到另一个数据库。
我知道这个问题已经回答了,但是我个人不会回答@JasonMcCays,因为事实上游标是流的,如果集合仍在使用,这可能会导致无限的游标循环。相反,我将使用快照():
http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database
@bens的答案也很好,不仅适用于集合的热备份,而且mongorestore也不需要共享同一神灵。
我会滥用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或主机名即可连接到远程服务器。我使用它将测试数据复制到测试数据库中进行测试。
这可能只是一个特例,但对于具有两个随机字符串字段(长度为15-20个字符)的100k文档集合,使用哑巴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); });
如果在两个远程mongod实例之间,请使用
{ cloneCollection: "<collection>", from: "<hostname>", query: { <query> }, copyIndexes: <true|false> }
请参阅 http://docs.mongodb.org/manual/reference/command/cloneCollection/
你可以随时使用Robomongo。从v0.8.3开始,有一个工具可以通过右键单击集合并选择"Copy collection to Database“来完成此操作。
有关详情,请参阅 http://blog.robomongo.org/whats-new-in-robomongo-0-8-3/
这个特性是 removed in 0.8.5 的,因为它有out的性质,所以如果你想尝试它,你必须使用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"}])
需要注意的是,不会在newCollection中复制来自oldCollection的索引。
在我的例子中,我必须在新集合中使用旧集合中的属性子集。所以当我在新的集合上调用insert时,我最终选择了这些属性。
db.<sourceColl>.find().forEach(function(doc) {
db.<newColl>.insert({
"new_field1":doc.field1,
"new_field2":doc.field2,
});`
如果内存不是问题,那么使用
insertMany
比使用
forEach
循环要快得多。
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())
通过单击数据库、收藏品或特定收藏品下载链接,使用具有导出和导入工具的“MongoDB Studio3T”: https://studio3t.com/download/
正如在其他答案中所给出的,最快的解决方案应该是
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=-
在运行共享集群的情况下,默认情况下不会对新集合进行分片。所有数据最初都会写入您的主分片。这可能会导致磁盘空间问题,并为 balancing 的群集带来额外的负载。在导入数据之前,最好像这样 pre-split 你的集合:
sh.shardCollection("some_or_other_database.some_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("some_or_other_database.some_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
活泼的石榴 · 如何在WPF应用程序中实现类似浏览器中文本框文本选择的功能? 11 月前 |
朝气蓬勃的豌豆 · SQL 语法--湖仓一体分析服务 LAS-火山引擎 1 年前 |
私奔的山楂 · 从嵌套列表中提取JSON值 1 年前 |