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.
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 .
db.myoriginal.aggregate([ { $match: {} }, { $out: "mycopy" } ])
C'est beaucoup plus rapide que de faire beaucoup d'inserts dans une boucle forEach.
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.
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])
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 /