【问题标题】:Clone a collection in MongoDB在 MongoDB 中克隆一个集合
【发布时间】:2012-01-19 21:08:20
【问题描述】:

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

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

【问题讨论】:

  • 公认的答案可以说是 2012 年最好的方法,但现在 db.cloneCollection() 是获得解决方案的好方法。

标签: mongodb mongo-collection


【解决方案1】:

又是MongoDB documentation comes to the rescue

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

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

【讨论】:

  • 从 2.1+ 开始,您可以执行 db.demo1.copyTo("demo2");
  • copyTo 阻止 mongod 实例中的所有其他操作
  • 在 2.0.4 中以这种方式将我所有集合的 int 值转换为 double 值......所以,这种方法不能保证 100% 相等......
  • copyTo 的问题是它需要 "anyResource" 上的 "anyAction" 角色,不建议将其提供给所有用户。 (如果您在大型组织中,可能不会授予您)显然,cloneCollection 是一个更好的选择,因为它只需要读\写权限。当然,上面的答案也可以。
  • 这些东西对我不起作用。它说 Message.find(...).forEach 不是函数
【解决方案2】:

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

db.source.copyTo("target"); 

&如果"target"不存在,就会被创建

-- 更新--

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

-- 更新--

因为CopyTo() 在内部使用eval() 并且eval() 自3.0 版起已弃用,因此CopyTo() 自3.0 版起也已弃用。

【讨论】:

  • 不要在生产系统上运行 copyTo。正如对已接受答案的评论中所述,它将有效地阻止您的 mongod 实例上的其他操作,使其在持续时间内不可用。
  • @JamesWahlin 感谢您的注意,我更新了答案,所以大家可以轻松看到它
  • cloneCollectionAsCapped 也会阻止其他操作。我是凭经验发现的……
  • 自 3.0 版后已弃用。
【解决方案3】:

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

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

它将 db_name 中的 src_collection 克隆到 dst_collection。或者您可以在 bson 级别分两步完成:

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

【讨论】:

  • 这种方式不仅最简单,而且还可以保证您在二进制级别上 100% 的身份,但 find() 和 insert() 方式却没有。例如,它将所有整数记录转换为数字等
  • 用于身份验证,并连接到远程服务器,在管道的两侧添加以下参数---host="whatever" --port="27017" --username="myuser" --password="mypass" --authenticationDatabase="admin"
【解决方案4】:

最快的选择是

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

【讨论】:

  • 我在我的 node.js 应用程序中使用github.com/caolan/async,这不适用于 mongodb node.js 驱动程序 - 我现在正在使用 find().forEach(....) 解决方案 - 仍然对此表示赞成,因为它在控制台中工作
  • 是的,这是从一个集合复制到另一个集合的最快方法 db.myoriginal_collection.aggregate([{$match: { id: "id" }},{ $out: "myoriginal_duplicate_collection" } ])
【解决方案5】:

已经有这个命令了。

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

【讨论】:

  • 您是正确的,此命令将允许您从一台服务器复制到另一台服务器。但是,原始问题指的是同一台服务器。如文档所示,如果您尝试将 cloneCollection 命令用于原始问题的目标,您将丢失您的集合
【解决方案6】:

如果您担心速度,那么我发现通过使用 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.categoriesdemo2.categories 的所有文档的选定字段集

【讨论】:

    【解决方案7】:

    不要使用db.cloneCollection()方法,它是从当前版本4.2贬值的,而是尝试使用mongoexport

    depreciated collection method

    【讨论】:

      【解决方案8】:

      在 mongo 控制台中,您也可以执行以下操作,其中 db_host 是 db_host 拥有您要克隆的集合的 db 的机器。

      使用 db.cloneCollection(, )

      【讨论】:

      • 抱歉有一些格式问题,应该使用 db_name 然后 db.cloneCollection(collection_name, db_host)
      • 和反向 db_host 和集合名称,即 db.cloneCollection(host, collection)
      • 不起作用:{ "ok" : 0, "errmsg" : "can't cloneCollection from self" }
      • check mongo docu: docs.mongodb.org/manual/reference/method/db.cloneCollection MongoDB 实例中要复制的集合。 db.cloneCollection() 只会从与当前数据库同名的数据库中复制具有此名称的集合 ** 远程 MongoDB 实例。如果要从不同的数据库名称复制集合,则必须直接使用 cloneCollection。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 2014-04-02
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多