Existe-t-il un moyen simple de procéder?
Existe-t-il un moyen simple de procéder?
Réponses:
Pour le moment, il n'y a aucune commande dans MongoDB qui ferait cela. Veuillez noter le billet JIRA avec la demande de fonctionnalité associée .
Vous pourriez faire quelque chose comme:
db.<collection_name>.find().forEach(function(d){ db.getSiblingDB('<new_database>')['<collection_name>'].insert(d); });
Veuillez noter qu'avec cela, les deux bases de données devraient partager le même mongod pour que cela fonctionne.
En plus de cela, vous pouvez effectuer un mongodump d'une collection à partir d'une base de données, puis restaurer la collection dans l'autre base de données.
La meilleure façon est de faire un mongodump puis mongorestore.
Vous pouvez sélectionner la collection via:
mongodump -d some_database -c some_collection
[Facultativement, zippez le dump ( zip some_database.zip some_database/* -r
) et scp
ailleurs]
Ensuite, restaurez-le:
mongorestore -d some_other_db -c some_or_other_collection dump/some_collection.bson
Les données existantes en some_or_other_collection
seront conservées. De cette façon, vous pouvez "ajouter" une collection d'une base de données à une autre.
Avant la version 2.4.3, vous devrez également rajouter vos index après avoir copié sur vos données. À partir de la version 2.4.3, ce processus est automatique et vous pouvez le désactiver avec --noIndexRestore
.
En fait, il existe une commande pour déplacer une collection d'une base de données vers une autre. Ce n'est pas appelé "déplacer" ou "copier".
Pour copier une collection, vous pouvez la cloner sur la même base de données, puis déplacer le clone.
Cloner:
> use db1
> db.source_collection.find().forEach( function(x){db.collection_copy.insert(x)} );
Bouger:
> use admin
switched to db admin
> db.runCommand({renameCollection: 'db1.source_collection', to: 'db2.target_collection'}) // who'd think rename could move?
Les autres réponses sont meilleures pour copier la collection, mais cela est particulièrement utile si vous cherchez à la déplacer.
'db1.source_collection'
J'abuserais de la fonction de connexion dans mongo cli mongo doc . cela signifie que vous pouvez démarrer une ou plusieurs connexions. si vous souhaitez copier la collection de clients de test vers test2 sur le même serveur. vous commencez d'abord mongo shell
use test
var db2 = connect('localhost:27017/test2')
faire une recherche normale et copier les 20 premiers enregistrements dans test2.
db.customer.find().limit(20).forEach(function(p) { db2.customer.insert(p); });
ou filtrer selon certains critères
db.customer.find({"active": 1}).forEach(function(p) { db2.customer.insert(p); });
changez simplement l'hôte local en IP ou nom d'hôte pour vous connecter au serveur distant. Je l'utilise pour copier les données de test dans une base de données de test pour les tests.
Si entre deux instances de mongod distantes, utilisez
{ cloneCollection: "<collection>", from: "<hostname>", query: { <query> }, copyIndexes: <true|false> }
Voir http://docs.mongodb.org/manual/reference/command/cloneCollection/
copyIndexes
champ d'option n'est en fait pas respecté. Les index sont toujours copiés. Voir SERVER-11418
pour les collections de grande taille, vous pouvez utiliser Bulk.insert ()
var bulk = db.getSiblingDB(dbName)[targetCollectionName].initializeUnorderedBulkOp();
db.getCollection(sourceCollectionName).find().forEach(function (d) {
bulk.insert(d);
});
bulk.execute();
Cela vous fera gagner beaucoup de temps . Dans mon cas, je copie une collection avec 1219 documents: iter vs Bulk (67 secs vs 3 secs)
Vous pouvez utiliser le cadre d'agrégation pour résoudre votre problème
db.oldCollection.aggregate([{$out : "newCollection"}])
Il convient de noter que les index de oldCollection ne seront pas copiés dans newCollection.
Je sais que cette question a été répondue, mais personnellement, je ne ferais pas de réponse @JasonMcCays en raison du fait que les curseurs diffusent et cela pourrait provoquer une boucle de curseur infinie si la collection est toujours utilisée. Au lieu de cela, j'utiliserais un instantané ():
http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database
@bens est également une bonne réponse et fonctionne bien pour les sauvegardes à chaud des collections non seulement cela, mais mongorestore n'a pas besoin de partager le même mongod.
Ce n'est peut-être qu'un cas spécial, mais pour une collection de documents de 100 000 avec deux champs de chaîne aléatoires (la longueur est de 15 à 20 caractères), l'utilisation d'un mapreduce stupide est presque deux fois plus rapide que find-insert / copy
db.coll.mapReduce(function() { emit(this._id, this); }, function(k,vs) { return vs[0]; }, { out : "coll2" })
En utilisant pymongo, vous devez avoir les deux bases de données sur le même mongod, j'ai fait ce qui suit:
db = base de données d'origine
db2 = base de données à copier
cursor = db["<collection to copy from>"].find()
for data in cursor:
db2["<new collection>"].insert(data)
Cela ne résoudra pas votre problème mais le shell mongodb a une copyTo
méthode qui copie une collection dans une autre dans la même base de données :
db.mycoll.copyTo('my_other_collection');
Il se traduit également de BSON en JSON, donc mongodump
/ mongorestore
sont la meilleure façon de procéder, comme d'autres l'ont dit.
Si la RAM n'est pas un problème, l'utilisation insertMany
est beaucoup plus rapide que la forEach
boucle.
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())
Au cas où certains utilisateurs de heroku trébucheraient ici et, comme moi, voudraient copier des données de la base de données intermédiaire dans la base de données de production ou vice versa, voici comment vous le faites très facilement (NB j'espère qu'il n'y a pas de fautes de frappe là-dedans, je ne peux pas le vérifier atm., Je vais essayer de confirmer la validité du code dès que possible):
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"
Vous pouvez toujours utiliser Robomongo. Depuis la v0.8.3, il existe un outil qui peut le faire en cliquant avec le bouton droit sur la collection et en sélectionnant "Copier la collection dans la base de données"
Pour plus de détails, voir http://blog.robomongo.org/whats-new-in-robomongo-0-8-3/
Cette fonctionnalité a été supprimée en 0.8.5 en raison de sa nature de buggy, vous devrez donc utiliser 0.8.3 ou 0.8.4 si vous voulez l'essayer.
Dans mon cas, j'ai dû utiliser un sous-ensemble d'attributs de l'ancienne collection dans ma nouvelle collection. J'ai donc fini par choisir ces attributs lors de l'appel de insert sur la nouvelle collection.
db.<sourceColl>.find().forEach(function(doc) {
db.<newColl>.insert({
"new_field1":doc.field1,
"new_field2":doc.field2,
....
})
});`
utiliser "Studio3T pour MongoDB" qui ont des outils d'exportation et d'importation en cliquant sur la base de données, les collections ou le lien de téléchargement de collection spécifique: https://studio3t.com/download/
Cela peut être fait en utilisant la db.copyDatabase
méthode de Mongo :
db.copyDatabase(fromdb, todb, fromhost, username, password)
Référence: http://docs.mongodb.org/manual/reference/method/db.copyDatabase/