我想克隆一个MongoDB集合并将其保存在具有不同名称的同一台服务器上。例如,现在我有以下集合:demo1.categories,demo1.users和demo2.users。在MongoDB中克隆一个集合
我想要一个与“demo1.categories”相同的“demo2.categories”。 (它只是具有不同的名称。)
我想克隆一个MongoDB集合并将其保存在具有不同名称的同一台服务器上。例如,现在我有以下集合:demo1.categories,demo1.users和demo2.users。在MongoDB中克隆一个集合
我想要一个与“demo1.categories”相同的“demo2.categories”。 (它只是具有不同的名称。)
又一次的MongoDB documentation comes to the rescue
假设集合实际上被命名为“demo1.categories”:
db.demo1.categories.find().forEach(function(x){db.demo2.categories.insert(x)});
那里已经有一个命令这一点。
将单个集合从一台服务器复制到另一台服务器。 http://www.mongodb.org/display/DOCS/cloneCollection+Command
您是正确的,该命令将允许您从一台服务器复制到另一台。但是,原来的问题是指同一台服务器。正如文档所示,如果您尝试使用cloneCollection命令来执行原始问题的目标 –
在mongo控制台中,还可以执行以下操作,其中db_host是db_host的db所在的计算机,并且您要克隆该集合的db。
使用 db.cloneCollection(,)
,那么您将丢失集合。对不起,有一些格式问题,应该使用db_name,然后使用db.cloneCollection(collection_name,db_host) – 2012-08-09 15:34:04
以及反向db_host和集合名称,即db.cloneCollection(主机,集合) – 2012-08-09 15:41:49
不起作用:{“ok”:0,“errmsg”:“不能从自己cloneCollection”} –
最简单的&有效的方法是使用copyTo(),所以你可以使用:
db.source.copyTo("target");
&如果"target"
不存在,这将是已创建
- 更新 -
根据CopyTo Documentation,由于copyTo()
在内部使用eval,复制操作将阻止mongod实例上的所有其他操作。所以它不应该用在生产环境中。
- 更新 -
因为CopyTo()
使用eval()
内部& eval()
因为3.0版本已过时,因此CopyTo()
也因为3.0版本弃用。
这就是克隆你的收藏以最快的方式:
mongoexport -d db_name -c src_collection | mongoimport -d db_name -c dst_collection --drop
将克隆src_collection在DB_NAME到dst_collection。或者你可以做的两个步骤上BSON级别:
mongodump -d db_name -c src_collection
mongorestore --drop -d db_name -c dst_collection ./dump/db_name/src_collection.bson
你真的拯救了我的一天。这是最简单的方法:D谢谢! – cgajardo
这种方式不仅是最简单的,而且还保证您在二进制级别上100%的身份,但find()和insert()方式不会。例如,它将所有的整数记录转换为数字等 – Tutankhamen
不错,干净+1 –
如果你关心的速度,然后我发现,通过使用aggregate
与$project
和$out
要快100倍,不知道是否有限制虽然,但你必须创建一组字段,你会想复制 例如:
// Set of fields in the categories collection var setOfFields = {field1:1, field2:1.......} db.demo1.categories.aggregate([{ "$project": setOfFields},{ $out: "demo2.categories"}]);
此副本(项目)从demo1.categories
到所有文档中,选定字段集合
最快的方式是
db.myoriginal.aggregate([ { $out: "mycopy" } ])
我在我的node.js应用程序中使用https://github.com/caolan/async,并且这对于mongodb不起作用node.js驱动程序 - 我现在使用'find()。forEach(....)'解决方案 - 仍然提高了效率,因为它在控制台中工作 –
甜,工作就像一个幸运符!谢谢:) – Daryna
从2.1+开始,你可以做db.demo1.copyTo(“demo2”); –
'copyTo'在2.0.4中阻止mongod实例 – r92