我正在尝试通过shell复制集合,但我收到了“未经授权”的错误,尽管它具有读/写权限。具体做法是:
db.createCollection("ITISAFAKE")
{ "ok" : 1 }
db.ITISAFAKE.insert({"Is it a fake?": true})
db.ITISAFAKE.find()
{ "_id" : ObjectId("52d5e51d4bb0851f985f69d8"), "Is it a fake?" : true }
db.ITISAFAKE.drop()
true
是的,工作正常。但是:
db.createCollection("FAKE")
{ "ok" : 1 }
db.FAKE.insert({senator: true})
db.FAKE.copyTo("FAKERY")
Tue Jan 14 17:36:26.188 { "ok" : 0, "errmsg" : "unauthorized" } at src/mongo/shell/db.js:571
所以,我可以通过逐字记录复制事物来解决这个问题,但这看起来很愚蠢。我可以摆弄用户权限等,但我怎么...实际上只是复制东西?
答案 0 :(得分:6)
根据MongoDB 2.4中的collection.copyTo()
文档,此shell帮助程序“使用服务器端JavaScript将所有文档从集合复制到newCollection”。
我希望您收到unauthorized
错误的原因是因为服务器端db.eval()
command在MongoDB 2.4中需要full admin permissions(admin
数据库上有多个角色)。
如果在没有mongo
的情况下调用copyTo()
,您实际上可以在()
shell中看到此帮助程序的来源:
> db.test.copyTo
function ( newName ){
return this.getDB().eval(
function( collName , newName ){
var from = db[collName];
var to = db[newName];
to.ensureIndex( { _id : 1 } );
var count = 0;
var cursor = from.find();
while ( cursor.hasNext() ){
var o = cursor.next();
count++;
to.save( o );
}
return count;
} , this.getName() , newName
);
}
由于使用了服务器端db.eval()
,copyTo()
使用several significant warnings,包括类型保真度和锁定问题的注意事项。我相信这个帮助程序仅用于具有更多开放权限的开发环境,而不是生产环境。
mongo
shell 所以,我可以通过记录
逐字记录文件来解决这个问题
这不是一个完全疯狂的选择:)。以下是mongo
shell的简单单行(适当地替换source
和target
个集合):
db.source.find().forEach( function(d) {db.target.insert(d)});
如果您担心网络带宽,可以从MongoDB服务器本地的mongo
shell运行。
mongodump
/ mongorestore
复制集合的更好方法(尽管不是直接来自mongo
shell)将使用mongodump
& mongorestore
:
$ mongodump -d test -c source
$ mongorestore -d test -c target dump/test/source.bson