Cómo copiar una colección de una base de datos a otra en MongoDB

¿Hay una manera simple de hacer esto?

Por el momento no hay ningún comando en MongoDB que pueda hacer esto. Tenga en cuenta el boleto JIRA con solicitud de función relacionada .

Podrías hacer algo como:

db..find().forEach(function(d){ db.getSiblingDB('')[''].insert(d); }); 

Tenga en cuenta que con esto, las dos bases de datos deberían compartir el mismo mongod para que esto funcione.

Además de esto, puede hacer un mongodump de una colección de una base de datos y luego mongorestre la colección a la otra base de datos.

La mejor manera es hacer un mongodump luego mongorestre.

Puede seleccionar la colección a través de:

 mongodump -d some_database -c some_collection 

[Opcionalmente, zip some_database.zip some_database/* -r el volcado ( zip some_database.zip some_database/* -r ) y scp en otro lugar]

Luego restaurarlo:

 mongorestre -d some_other_db -c some_or_other_collection dump/some_collection.bson 

Se conservarán los datos existentes en some_or_other_collection . De esta forma, puede “agregar” una colección de una base de datos a otra.

Antes de la versión 2.4.3, también deberá agregar sus índices una vez que haya copiado sus datos. Comenzando con 2.4.3, este proceso es automático y puede deshabilitarlo con --noIndexRestore .

En realidad, hay un comando para mover una colección de una base de datos a otra. Simplemente no se llama “mover” o “copiar”.

Para copiar una colección, puede clonarla en el mismo archivo db y luego mover el clon.

Para clonar:

 > use db1 > db.source_collection.find().forEach( function(x){db.collection_copy.insert(x)} ); 

Para mover:

 > use admin switched to db admin > db.runCommand({renameCollection: 'db1.source_collection', to: 'db2.target_collection'}) // who'd think rename could move? 

Las otras respuestas son mejores para copiar la colección, pero esto es especialmente útil si está buscando moverla.

Abusaría de la función de conexión en mongo cli mongo doc . eso significa que puede iniciar una o más conexiones. si desea copiar la recostackción de clientes de la prueba a la prueba 2 en el mismo servidor. primero empiezas mongo shell

 use test var db2 = connect('localhost:27017/test2') 

haga un hallazgo normal y copie los primeros 20 registros en test2.

 db.customer.find().limit(20).forEach(function(p) { db2.customer.insert(p); }); 

o filtrar por algunos criterios

 db.customer.find({"active": 1}).forEach(function(p) { db2.customer.insert(p); }); 

simplemente cambie el host local a IP o nombre de host para conectarse al servidor remoto. Utilizo esto para copiar datos de prueba a una base de datos de prueba para probar.

Si entre dos instancias de mongod remotas, use

 { cloneCollection: "", from: "", query: {  }, copyIndexes:  } 

Ver http://docs.mongodb.org/manual/reference/command/cloneCollection/

Yo solía hacer:

 use sourcedatabase; var docs=db.sourcetable.find(); use targetdatabase; docs.forEach(function(doc) { db.targettable.insert(doc); }); 

Sé que esta pregunta ha sido respondida, pero personalmente no respondería a @JasonMcCays debido al hecho de que los cursores se transmiten y esto podría causar un ciclo de cursor infinito si la colección todavía se está utilizando. En cambio, usaría una instantánea ():

http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database

La respuesta de @bens también es buena y funciona bien para las copias de seguridad de las colecciones, no solo eso, sino que mongorestre no necesita compartir el mismo mongod.

Esto podría ser solo un caso especial, pero para una colección de documentos 100k con dos campos de cadena aleatorios (la longitud es de 15-20 caracteres), usar un mapreduce tonto es casi el doble de rápido que find-insert / copyTo:

 db.coll.mapReduce(function() { emit(this._id, this); }, function(k,vs) { return vs[0]; }, { out : "coll2" }) 

Puede usar el marco de agregación para resolver su problema

 db.oldCollection.aggregate([{$out : "newCollection"}]) 

Cabe señalar que los índices de oldCollection no se copiarán en newCollection.

Usando pymongo, necesitas tener ambas bases de datos en el mismo mongod, hice lo siguiente:


db = base de datos original
db2 = base de datos a copiar

 cursor = db[""].find() for data in cursor: db2[""].insert(data) 

Esto no resolverá su problema, pero el shell mongodb tiene un método copyTo que copia una colección en otra en la misma base de datos :

 db.mycoll.copyTo('my_other_collection'); 

También se traduce de BSON a JSON, por lo que mongodump / mongorestre es la mejor manera de hacerlo, como han dicho otros.

En caso de que algunos usuarios de heroku tropiecen aquí y quieran copiar algunos datos de la base de datos de producción a la base de datos de producción o viceversa, así es cómo se hace de manera muy conveniente (Nota: espero que no haya errores tipográficos ahí, no se puede comprobar en cajeros automáticos). Voy a tratar de confirmar la validez del código lo antes posible):

 to_app="The name of the app you want to migrate data to" from_app="The name of the app you want to migrate data from" collection="the collection you want to copy" mongohq_url=`heroku config:get --app "$to_app" MONGOHQ_URL` parts=(`echo $mongohq_url | sed "s_mongodb://heroku:__" | sed "s_[@/]_ _g"`) to_token=${parts[0]}; to_url=${parts[1]}; to_db=${parts[2]} mongohq_url=`heroku config:get --app "$from_app" MONGOHQ_URL` parts=(`echo $mongohq_url | sed "s_mongodb://heroku:__" | sed "s_[@/]_ _g"`) from_token=${parts[0]}; from_url=${parts[1]}; from_db=${parts[2]} mongodump -h "$from_url" -u heroku -d "$from_db" -p"$from_token" -c "$collection" -o col_dump mongorestre -h "$prod_url" -u heroku -d "$to_app" -p"$to_token" --dir col_dump/"$col_dump"/$collection".bson -c "$collection" 

Esto se puede hacer utilizando el método db.copyDatabase de Mongo:

 db.copyDatabase(fromdb, todb, fromhost, username, password) 

Referencia: http://docs.mongodb.org/manual/reference/method/db.copyDatabase/

Siempre puedes usar Robomongo. A partir de v0.8.3 hay una herramienta que puede hacer esto haciendo clic con el botón derecho en la colección y seleccionando “Copiar colección a la base de datos”.

Para detalles, ver http://blog.robomongo.org/whats-new-in-robomongo-0-8-3/

Esta característica se eliminó en 0.8.5 debido a su naturaleza defectuosa, por lo que tendrá que usar 0.8.3 o 0.8.4 si quiere probarla.

Si RAM no es un problema al usar insertMany es mucho más rápido que para forEach ciclo.

 var db1 = connect(':/') var db2 = connect(':/') var _list = db1.getCollection('collection_to_copy_from').find({}) db2.collection_to_copy_to.insertMany(_list.toArray()) 

En mi caso, tuve que usar un subconjunto de atributos de la colección anterior en mi nueva colección. Así que terminé eligiendo esos atributos al llamar a insertar en la nueva colección.

 db..find().forEach(function(doc) { db..insert({ "new_field1":doc.field1, "new_field2":doc.field2, .... }) });` 

para colecciones de gran tamaño, puedes usar Bulk.insert ()

 var bulk = db.getSiblingDB(dbName)[targetCollectionName].initializeUnorderedBulkOp(); db.getCollection(sourceCollectionName).find().forEach(function (d) { bulk.insert(d); }); bulk.execute(); 

Esto ahorrará mucho tiempo . En mi caso, estoy copiando la colección con 1219 documentos: iter vs Bulk (67 segundos frente a 3 segundos)