MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Collection Mongo Copy et autorisations utilisateur

Selon le collection.copyTo() documentation dans MongoDB 2.4, cet assistant shell "copie tous les documents de la collection dans newCollection en utilisant JavaScript côté serveur".

J'attends la raison pour laquelle vous obtenez un unauthorized l'erreur est due au côté serveur db.eval() commande nécessite autorisations d'administrateur complètes dans MongoDB 2.4 (plusieurs rôles sur le admin base de données).

Vous pouvez en fait voir la source de cette aide dans le mongo shell si vous invoquez copyTo() sans le () :

> 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
    );
}

En raison de l'utilisation de db.eval() côté serveur , il existe plusieurs avertissements importants sur copyTo() utilisation, y compris les mises en garde sur la fidélité de type et les problèmes de verrouillage. Je pense que cet assistant est uniquement destiné à être utilisé dans des environnements de développement avec des autorisations plus ouvertes, plutôt que dans un environnement de production.

Copie DIY du mongo coquille

Ce n'est pas une option complètement folle :). Voici un simple one-liner pour le mongo shell (remplace source et target collections, le cas échéant) :

db.source.find().forEach( function(d) {db.target.insert(d)});

Si vous êtes préoccupé par la bande passante du réseau, vous pouvez l'exécuter à partir d'un mongo shell qui est local sur votre serveur MongoDB.

Copier avec mongodump / mongorestore

Une meilleure approche pour copier une collection (mais pas directement depuis le mongo shell) serait d'utiliser mongodump &mongorestore :

$ mongodump -d test -c source 
$ mongorestore -d test -c target dump/test/source.bson