web-dev-qa-db-fra.com

Quel est le moyen le plus rapide de copier une collection dans la même base de données?

Je veux copier une collection dans même base de données et lui donner un nom Différent - prendre un instantané.

Quelle est la meilleure façon de faire cela? Existe-t-il une commande ou dois-je copier chaque enregistrement à tour de rôle? 

Je connais la commande cloneCollection, mais il semble que ce soit pour Copier uniquement sur un autre serveur. 

Je connais aussi mongoimport et mongoexport, mais comme je le fais via PHP, je préférerais ne pas appeler le shell.

46
Tim

Vous avez quelques options, mais le plus rapide est:

mongodump -d db -c sourcecollection 
mongorestore -d db -c targetcollection --dir=dump/<db>/<sourcecollection.bson>

mongoexport -d db -c sourcecollection | mongoimport -d db -c targetcollection --drop

ou en php:

`mongoexport -d db -c sourcecollection | mongoimport -d db -c targetcollection --drop`;

après cela vous avez

mongo db < script.js

comme le montre la mongo docs , script.js contient quelque chose comme:

db.myoriginal.find().forEach( function(x){db.mycopy.insert(x)} );

Le moyen le plus lent (d'un ordre de grandeur ou plus) de copier une collection consiste à utiliser le pilote php natif - simplement en raison du déplacement d'informations. Mais vous pouvez émettre la requête mongo ci-dessus si vous voulez absolument éviter les appels cli en utilisant la fonction db execute .

46
AD7six
db.myoriginal.aggregate([ { $match: {} }, { $out: "mycopy" } ])

C'est beaucoup plus rapide que de faire beaucoup d'inserts dans une boucle forEach.

148
yoooshi

Le moyen le plus simple et le plus efficace consiste à utiliser copyTo () , afin que vous puissiez utiliser:

db.source.copyTo("target"); 

& si "target" n'existe pas, il sera créé

-- Mettre à jour --

Conformément à Documentation CopyTo , étant donné que copyTo() utilise eval en interne, les opérations de copie bloquent toutes les autres opérations sur l’instance mongod. Donc, il ne doit pas être utilisé en production environnement.

-- Mettre à jour --

Étant donné que CopyTo() utilise eval() internally & eval() est obsolète depuis la version 3.0, donc CopyTo() est également déconseillé depuis la version 3.0.

13
AbdelHady

Voici mon implémentation en python (pymongo):

def copy_collection(client, from_db, from_coll, to_db=None, to_coll=None):
    to_db = from_db if to_db is None else to_db
    to_coll = from_coll if to_coll is None else to_coll
    assert (to_db != from_db or to_coll != from_coll), "Copy Error: Source and destination can't be same!"
    documents = client[from_db][from_coll].find()
    client[to_db][to_coll].insert_many([d for d in documents])
0
LateDog

En plus de la solution AD7six 1st, si vous utilisez mongoexport/import, assurez-vous des types de données de collecte et de la configuration de mongo, comme expliqué ici: http://docs.mongodb.org/manual/reference/mongodb-extended-json /

0
kij