mongodb - 如何将集合从一个 MongoDB 克隆到同一服务器上的另一个
问题描述
我正在使用 Mongo 3.2。我的本地主机上有两个名为client1和client2的数据库。现在client1包含一个名为users的集合。我想将此集合克隆到client2。
我努力了:-
使用客户端2
db.cloneCollection('localhost:27017', 'client1.users', { 'active' : true } )
这输出
{ "ok" : 0.0, "errmsg" : "不能从 self 克隆Collection" }
是否禁止将集合从一个数据库克隆到同一服务器上的另一个数据库?
解决方案
一些事情 :
- 一般来说, cloneCollection用于不同的 mongo 实例,但不能复制到相同的实例上。
- 此外,如果您正在使用
v4.2
,您应该停止使用copyDB
&cloneCollection
因为它们已被弃用compatible-with-v4.2 & 开始使用mongodump和mongorestore或mongoexport & mongoimport。 我建议使用mongodump和mongorestore:
- 因为mongodump会保留 MongoDB 的数据类型,即;
bson
类型。 - mongodump创建一个二进制文件,其中mongoexport将转换
bson
为json
& 再次mongoimport将在写入时转换json
为bson
,这就是它们速度慢的原因。当您想直观地分析您的收藏数据或将json
数据用于任何其他目的时,您可以使用 mongoexport 和 mongoimport。
- 因为mongodump会保留 MongoDB 的数据类型,即;
您可以在 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
。如果您想备份多个集合,上述脚本将很有用,您需要在脚本中指定一些内容,例如:
mongodump--host "All-shards"
-> 如果您的 MongoDB 是副本集,您需要在此处指定所有分片,如果不是,您可以指定localhost:27017
.mongorestore --host=host-shard-name
-> 你必须指定一个副本集的分片,否则你的localhost
, 这里的一些东西可以是可选--ssl
的 ,--username
,--password
.- 因此mongodump将第一次创建一个名为dump的文件夹,其中将包含带有 dbNames 的子文件夹,并且每个子文件夹都将
bson
转储与其集合名称相对应的文件,因此您需要dbName
在 restore 命令中引用 & 集合名称将取自变量i
->./dump/dbName/"$i".bson
注意: MongoDBv3.2
太老了,在基于云的 MongoDB 服务Mongo-atlas中,它已经到了生命周期的尽头,所以请尽快升级。如果您正在寻找免费的 mongo 实例或从 MongoDB 开始 - 您可以尝试 atlas。
推荐阅读
- toit - 我需要使用 pubsub 消息吗?
- html - 动画单选按钮的问题
- swift - 如何在 swiftUI 中切换到另一个 TabView?
- html - 将固定的导航栏和侧边栏放在 Angular 应用程序的所有组件中
- c# - C# 如何将(过滤的)文件列表传递给 WebDav.Client 并上传该列表中的所有文件?现在我只能放单个文件
- google-earth-engine - 有没有办法在 GEE 本身中编辑 GEE 中上传的资产?
- db2 - 有没有办法在 AS400 上使用 Flyway?
- javascript - Javascript Promise 根据是否使用大括号返回不同的值。这是为什么?
- python-3.x - 如何使用 Python 正确使用锁定功能
- python - Qcut/Cut 和 Groupby 证据权重