首页 > 解决方案 > 如何将集合从一个 MongoDB 克隆到同一服务器上的另一个

问题描述

我正在使用 Mongo 3.2。我的本地主机上有两个名为client1client2的数据库。现在client1包含一个名为users的集合。我想将此集合克隆到client2

我努力了:-

使用客户端2

db.cloneCollection('localhost:27017', 'client1.users', { 'active' : true } )

这输出

{ "ok" : 0.0, "errmsg" : "不能从 self 克隆Collection" }

是否禁止将集合从一个数据库克隆到同一服务器上的另一个数据库?

标签: mongodbmongodb-queryclone

解决方案


一些事情 :

  1. 一般来说, cloneCollection用于不同的 mongo 实例,但不能复制到相同的实例上。
  2. 此外,如果您正在使用v4.2,您应该停止使用copyDB&cloneCollection因为它们已被弃用compatible-with-v4.2 & 开始使用mongodumpmongorestoremongoexport & mongoimport
  3. 我建议使用mongodumpmongorestore

    1. 因为mongodump会保留 MongoDB 的数据类型,即;bson类型。
    2. mongodump创建一个二进制文件,其中mongoexport将转换bsonjson& 再次mongoimport将在写入时转换jsonbson,这就是它们速度慢的原因。当您想直观地分析您的收藏数据或将json数据用于任何其他目的时,您可以使用 mongoexport 和 mongoimport。
  4. 您可以在 shell 中运行以下脚本

    declare - a collections = ("collectionName1" "collectionName2")
    for i in "${collections[@]}"
    do
    echo "$i"
        mongodump --host "All-shards" --username=uname --password password --ssl --authenticationDatabase admin --db dbname --collection "$i"
    
        mongorestore --host=host-shard-name --port=27017 --username=uname --password=psswrd --ssl --authenticationDatabase=admin --db=dbname --collection= "$i" ./dump/dbName/"$i".bson;
    done
    

要使用mongodump,您必须针对正在运行的 mongod 或 mongos 实例运行 mongodump。因此,这些命令正在运行,期望 mongo 已正确安装并且路径设置良好,如果没有,您可以导航到 mongo 文件夹并像./mongodump&一样运行./mongorestore。如果您想备份多个集合,上述脚本将很有用,您需要在脚本中指定一些内容,例如:

  1. mongodump--host "All-shards"-> 如果您的 MongoDB 是副本集,您需要在此处指定所有分片,如果不是,您可以指定localhost:27017.

  2. mongorestore --host=host-shard-name-> 你必须指定一个副本集的分片,否则你的localhost, 这里的一些东西可以是可选--ssl的 , --username, --password.

  3. 因此mongodump将第一次创建一个名为dump的文件夹,其中将包含带有 dbNames 的子文件夹,并且每个子文件夹都将bson转储与其集合名称相对应的文件,因此您需要dbName在 restore 命令中引用 & 集合名称将取自变量i->./dump/dbName/"$i".bson

注意: MongoDBv3.2太老了,在基于云的 MongoDB 服务Mongo-atlas中,它已经到了生命周期的尽头,所以请尽快升级。如果您正在寻找免费的 mongo 实例或从 MongoDB 开始 - 您可以尝试 atlas。


推荐阅读