【问题标题】:Mongo Copy Collection and User PermissionsMongo 副本收集和用户权限
【发布时间】:2014-01-23 19:36:08
【问题描述】:

我试图通过 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

所以,我可以通过逐条记录逐条复制来解决这个问题,但这似乎很愚蠢。我可以摆弄用户权限等,但我怎么……实际上只是复制东西?

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

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

    我预计您收到 unauthorized 错误的原因是因为服务器端 db.eval() command 在 MongoDB 2.4 中需要 full admin permissionsadmin 数据库上的多个角色)。

    如果您在没有() 的情况下调用copyTo(),您实际上可以在mongo 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 的 DIY 副本

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

    这不是一个完全疯狂的选择:)。这是mongo shell 的简单单行代码(酌情替换sourcetarget 集合):

    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                                                                                                                                            
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 2017-02-01
      • 2018-03-18
      • 2021-06-12
      • 2016-12-09
      • 2018-10-26
      • 2021-03-13
      相关资源
      最近更新 更多