在MongoDB中克隆集合

在MongoDB中克隆集合,mongodb,mongo-collection,Mongodb,Mongo Collection,我想克隆MongoDB集合并将其保存在同一台服务器上,使用不同的名称。例如,现在我有以下集合:demo1.categories、demo1.users和demo2.users 我想要一个与“demo1.categories”相同的“demo2.categories”。(它只是有一个不同的名字。)再一次 假设集合实际命名为“demo1.categories”: 已经有一个用于此的命令 将单个集合从一台服务器复制到另一台服务器。 在mongo控制台中,您还可以执行以下操作,其中db_主机是指db_主

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

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

再一次

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


已经有一个用于此的命令

将单个集合从一台服务器复制到另一台服务器。

在mongo控制台中,您还可以执行以下操作,其中db_主机是指db_主机拥有包含要克隆的集合的db的机器

使用
db.cloneCollection(,)

最简单有效的方法是使用,因此您可以使用:

db.source.copyTo("target"); 
&如果
“目标”
不存在,将创建它

--更新--

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

--更新--


由于
CopyTo()
在内部使用&
eval()
自3.0版以来已被弃用,因此
CopyTo()
自3.0版以来也被弃用。

这是克隆收藏的最快方法:

mongoexport -d db_name -c src_collection | mongoimport -d db_name -c dst_collection --drop
它将db\u name中的src\u集合克隆到dst\u集合。或者,您可以在bson级别上分两步执行此操作:

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

如果您关心速度,那么我发现通过使用
聚合
$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
复制(投影)到
demo2.categories
最快的选项是

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

不要使用
db.cloneCollection()
方法,它是从当前版本
4.2
中折旧的,请尝试使用
mongoexport


从2.1+开始,您可以执行db.demo1.copyTo(“demo2”)
copyTo
阻止mongod instancein 2.0.4中的所有其他操作。通过这种方式,我的集合的所有int值都转换为双值。。。所以,这种方法不能保证100%的平等性……copyTo的问题是,它需要“anyResource”上的“anyAction”角色,不建议给所有用户。(如果您在大型组织中,可能不会被授予)显然,
cloneCollection
是一个更好的选择,因为它需要的只是读写权限。当然,上面的答案也适用。这些东西对我不起作用。它说Message.find(…).forEach不是一个函数。正确的说法是,此命令将允许您从一台服务器复制到另一台服务器。然而,最初的问题是指同一台服务器。如文档所示,如果您试图使用cloneCollection命令作为原始问题的目标,您将丢失您的集合。如果存在一些格式问题,则应先使用db_name,然后使用db.cloneCollection(collection_name,db_host)并反转db_host和collection name,即db.cloneCollection(host,collection)这不起作用:{“确定”:0,“errmsg”:“无法从自身克隆”}检查mongo docu:MongoDB实例中要复制的集合。db.cloneCollection()将仅从与当前数据库同名的数据库**远程MongoDB实例中复制名为**的集合。如果要从其他数据库名称复制集合,必须直接使用cloneCollection。不要在生产系统上运行copyTo。正如在接受答案的评论中提到的,它将有效阻止mongod实例上的其他操作,从而使其在整个过程中不可用。@JamesWahlin感谢您的提示,我更新了答案,因此每个人都可以轻松地看到它
cloneCollectionAsCapped
还将阻止其他操作。我是凭经验发现它的……从3.0版开始就被弃用了。这种方法不仅简单,而且可以保证您在二进制级别上100%的身份,但find()和insert()方法不行。例如,它将所有整数记录转换为数字,用于身份验证,要连接到远程服务器,请在管道的两侧添加以下参数-
--host=“whatever”-port=“27017”--username=“myuser”--password=“mypass”--authenticationDatabase=“admin”
我在我的node.js应用程序中使用,但这对mongodb node.js驱动程序不起作用-我现在使用的是
find().forEach(…)
解决方案-仍然对此进行了投票,因为它在控制台中工作啊,这是从一个集合复制到另一个db.myoriginal_集合的最快方法,{$out:“myoriginal\u duplicate\u collection”})公认的答案可以说是2012年最好的方法,但现在db.cloneCollection()是获得解决方案的一个好方法。
db.myoriginal.aggregate([ { $out: "mycopy" } ])