2012-01-19 138 views
45

我想克隆一个MongoDB集合并将其保存在具有不同名称的同一台服务器上。例如,现在我有以下集合:demo1.categories,demo1.users和demo2.users。在MongoDB中克隆一个集合

我想要一个与“demo1.categories”相同的“demo2.categories”。 (它只是具有不同的名称。)

回答

76

又一次的MongoDB documentation comes to the rescue

假设集合实际上被命名为“demo1.categories”:

db.demo1.categories.find().forEach(function(x){db.demo2.categories.insert(x)}); 
+2

甜,工作就像一个幸运符!谢谢:) – Daryna

+53

从2.1+开始,你可以做db.demo1.copyTo(“demo2”); –

+12

'copyTo'在2.0.4中阻止mongod实例 – r92

2

那里已经有一个命令这一点。

将单个集合从一台服务器复制到另一台服务器。 http://www.mongodb.org/display/DOCS/cloneCollection+Command

+7

您是正确的,该命令将允许您从一台服务器复制到另一台。但是,原来的问题是指同一台服务器。正如文档所示,如果您尝试使用cloneCollection命令来执行原始问题的目标 –

-2

在mongo控制台中,还可以执行以下操作,其中db_host是db_host的db所在的计算机,并且您要克隆该集合的db。

使用 db.cloneCollection(,)

+0

,那么您将丢失集合。对不起,有一些格式问题,应该使用db_name,然后使用db.cloneCollection(collection_name,db_host) – 2012-08-09 15:34:04

+1

以及反向db_host和集合名称,即db.cloneCollection(主机,集合) – 2012-08-09 15:41:49

+0

不起作用:{“ok”:0,“errmsg”:“不能从自己cloneCollection”} –

28

最简单的&有效的方法是使用copyTo(),所以你可以使用:

db.source.copyTo("target"); 

&如果"target"不存在,这将是已创建

- 更新 -

根据CopyTo Documentation,由于copyTo()在内部使用eval,复制操作将阻止mongod实例上的所有其他操作。所以它不应该用在生产环境中。

- 更新 -

因为CopyTo()使用eval()内部& eval()因为3.0版本已过时,因此CopyTo()也因为3.0版本弃用。

+2

请勿在生产系统上运行copyTo。正如在接受的答案的评论中提到的那样,它会阻止您的mongod实例上的其他操作,从而有效地使其不可用。 –

+0

@JamesWahlin谢谢你的提示,我更新了答案,所以每个人都可以轻松看到 – AbdelHady

+0

'cloneCollectionAsCapped'也会阻止其他操作。我凭经验发现它... – Emer

18

这就是克隆你的收藏以最快的方式:

mongoexport -d db_name -c src_collection | mongoimport -d db_name -c dst_collection --drop 

将克隆src_collectionDB_NAMEdst_collection。或者你可以做的两个步骤上BSON级别:

mongodump -d db_name -c src_collection 
mongorestore --drop -d db_name -c dst_collection ./dump/db_name/src_collection.bson 
+2

你真的拯救了我的一天。这是最简单的方法:D谢谢! – cgajardo

+3

这种方式不仅是最简单的,而且还保证您在二进制级别上100%的身份,但find()和insert()方式不会。例如,它将所有的整数记录转换为数字等 – Tutankhamen

+0

不错,干净+1 –

2

如果你关心的速度,然后我发现,通过使用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到所有文档中,选定字段集合

11

最快的方式是

db.myoriginal.aggregate([ { $out: "mycopy" } ]) 
+0

我在我的node.js应用程序中使用https://github.com/caolan/async,并且这对于mongodb不起作用node.js驱动程序 - 我现在使用'find()。forEach(....)'解决方案 - 仍然提高了效率,因为它在控制台中工作 –