¿Hay una manera simple de hacer esto?
¿Hay una manera simple de hacer esto?
Respuestas:
Por el momento no hay un comando en MongoDB que haga esto. Tenga en cuenta el boleto JIRA con la solicitud de función relacionada .
Podrías hacer algo como:
db.<collection_name>.find().forEach(function(d){ db.getSiblingDB('<new_database>')['<collection_name>'].insert(d); });
Tenga en cuenta que con esto, las dos bases de datos tendrían que 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 mongorestore la colección a la otra base de datos.
La mejor manera es hacer un mongodump y luego mongorestore.
Puede seleccionar la colección a través de:
mongodump -d some_database -c some_collection
[Opcionalmente, comprime el dump ( zip some_database.zip some_database/* -r
) y scp
en otro lugar]
Luego restaurarlo:
mongorestore -d some_other_db -c some_or_other_collection dump/some_collection.bson
Los datos existentes en some_or_other_collection
se conservarán. De esa manera puede "agregar" una colección de una base de datos a otra.
Antes de la versión 2.4.3, también deberá volver a agregar sus índices después de copiar sus datos. A partir de 2.4.3, este proceso es automático y puede deshabilitarlo con --noIndexRestore
.
En realidad, no es un comando para mover una colección de una base de datos a otro. Simplemente no se llama "mover" o "copiar".
Para copiar una colección, puede clonarla en la misma base de datos y luego mover la copia.
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.
'db1.source_collection'
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 colección de clientes de prueba a prueba2 en el mismo servidor. primero comienzas mongo shell
use test
var db2 = connect('localhost:27017/test2')
haga una búsqueda normal y copie los primeros 20 registros a 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. Lo uso para copiar datos de prueba a una base de datos de prueba para probar.
Si está entre dos instancias remotas de mongod, use
{ cloneCollection: "<collection>", from: "<hostname>", query: { <query> }, copyIndexes: <true|false> }
Ver http://docs.mongodb.org/manual/reference/command/cloneCollection/
copyIndexes
campo de opción en realidad no se respeta. Los índices siempre se copian. Ver SERVER-11418
para colecciones de gran tamaño, puede 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)
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.
Sé que esta pregunta ha sido respondida, sin embargo, personalmente no respondería @JasonMcCays debido al hecho de que los cursores fluyen y esto podría causar un bucle de cursor infinito si la colección todavía se está utilizando. En su lugar, 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 colecciones, no solo eso, sino que mongorestore no necesita compartir el mismo mongod.
Esto podría ser solo un caso especial, pero para una colección de documentos de 100k con dos campos de cadena aleatorios (la longitud es de 15-20 caracteres), el uso de un mapa reducido 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" })
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["<collection to copy from>"].find()
for data in cursor:
db2["<new collection>"].insert(data)
Esto no resolverá su problema, pero el shell mongodb tiene un copyTo
método 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
/ mongorestore
son la mejor manera de hacerlo, como han dicho otros.
Si la RAM no es un problema, el uso insertMany
es mucho más rápido que el forEach
bucle.
var db1 = connect('<ip_1>:<port_1>/<db_name_1>')
var db2 = connect('<ip_2>:<port_2>/<db_name_2>')
var _list = db1.getCollection('collection_to_copy_from').find({})
db2.collection_to_copy_to.insertMany(_list.toArray())
En caso de que algunos usuarios de heroku tropiecen aquí y, como yo, quieran copiar algunos datos de la base de datos provisional a la base de datos de producción o viceversa, así es como lo hacen de manera muy conveniente (Nota: espero que no haya errores tipográficos allí, no puedo verificarlo en el cajero automático). Intentaré 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
mongorestore -h "$prod_url" -u heroku -d "$to_app" -p"$to_token" --dir col_dump/"$col_dump"/$collection".bson -c "$collection"
Siempre puedes usar Robomongo. A partir de v0.8.3 hay una herramienta que puede hacer esto haciendo clic derecho en la colección y seleccionando "Copiar colección a la base de datos"
Para más detalles, consulte 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 deberá usar 0.8.3 o 0.8.4 si desea probarla.
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 insert en la nueva colección.
db.<sourceColl>.find().forEach(function(doc) {
db.<newColl>.insert({
"new_field1":doc.field1,
"new_field2":doc.field2,
....
})
});`
use "Studio3T para MongoDB" que tiene herramientas de exportación e importación haciendo clic en la base de datos, colecciones o enlace de descarga de colección específica: https://studio3t.com/download/
Esto se puede hacer usando el db.copyDatabase
método de Mongo :
db.copyDatabase(fromdb, todb, fromhost, username, password)
Referencia: http://docs.mongodb.org/manual/reference/method/db.copyDatabase/