Mongo复制集合和用户权限

use*_*408 2 mongodb mongodb-query

我试图通过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
Run Code Online (Sandbox Code Playgroud)

是的,工作正常.然而:

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
Run Code Online (Sandbox Code Playgroud)

所以,我可以通过逐字记录复制事物来解决这个问题,但这看起来很愚蠢.我可以摆弄用户权限等,但我怎么...实际上只是复制东西?

Ste*_*nie 6

根据collection.copyTo()MongoDB 2.4中的文档,这个shell帮助程序"使用服务器端JavaScript将所有文档从集合复制到newCollection".

我希望您收到unauthorized错误的原因是因为服务器端db.eval()命令需要MongoDB 2.4中的完全管理员权限(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
    );
}
Run Code Online (Sandbox Code Playgroud)

由于使用了服务器端db.eval(),因此在使用时会出现几个重要警告,copyTo()包括类型保真度和锁定问题的注意事项.我相信这个帮助程序仅用于具有更多开放权限的开发环境,而不是生产环境.

mongoshell 复制DIY

所以,我可以通过逐字记录复制事物来解决这个问题

这不是一个完全疯狂的选择:).这是一个简单的mongoshell 单行(适当的替换sourcetarget集合):

db.source.find().forEach( function(d) {db.target.insert(d)});
Run Code Online (Sandbox Code Playgroud)

如果您担心网络带宽,可以从mongoMongoDB服务器本地的shell 运行它.

复制用mongodump/mongorestore

复制集合(虽然不是直接来自mongoshell)的更好方法是使用mongodump&mongorestore:

$ mongodump -d test -c source 
$ mongorestore -d test -c target dump/test/source.bson                                                                                                                                            
Run Code Online (Sandbox Code Playgroud)