MongoDB 3.2同一服务器跨数据库克隆集合失败求助
同一服务器跨数据库克隆集合的解决方案
哦,这个问题我碰到过!不是同一服务器跨库克隆被禁止,而是你用的db.cloneCollection()根本就不是干这个活的——它是给不同MongoDB实例之间复制集合用的,当你指定localhost:27017作为源时,MongoDB会识别出这和当前运行的是同一个实例,所以就抛出了"can't cloneCollection from self"的错误。
针对MongoDB 3.2,给你几个靠谱的同一实例内跨库克隆的方法:
方法1:用copyTo()快速复制(适合中小集合)
这个命令就是专门为同一实例跨库复制设计的,操作起来很简单:
// 先切到源数据库 use client1 // 直接把整个users集合复制到client2的users集合(目标集合不存在会自动创建) db.users.copyTo("client2.users") // 如果要像你原来那样只复制active为true的文档,加个查询就行 db.users.find({active: true}).copyTo("client2.users")
它会把查询结果逐条插入目标集合,小数据量用起来特别顺手。
方法2:用聚合$out(灵活高效,支持复杂处理)
如果需要对数据做一些过滤、转换再复制,或者数据量稍大,用聚合的$out阶段会更高效:
use client1 db.users.aggregate([ {$match: {active: true}}, // 先过滤出你要的文档 {$out: {db: "client2", coll: "users"}} // 直接输出到目标数据库的集合 ])
这个方法在处理大数据时性能更好,还能在聚合管道里加其他操作(比如字段重命名、分组等)。
方法3:用mongodump/mongorestore(适合大规模数据)
如果集合数据量很大,或者需要严谨的备份式复制,用命令行工具更稳妥:
- 先导出client1里符合条件的users集合:
mongodump --db client1 --collection users --query '{"active": true}' --out ./dump
- 再把导出的数据导入到client2:
mongorestore --db client2 --collection users ./dump/client1/users.bson
这种方法还能保留集合的索引、约束等元数据,适合生产环境的大规模复制。
另外提一句:MongoDB 3.2之后的版本有db.collection.clone()命令,但它同样是给跨实例克隆用的,同一实例内还是上面的方法更合适。
内容的提问来源于stack exchange,提问作者saurabh gupta




