Wat is de snelste manier om een ​​collectie binnen dezelfde database te kopiëren?

Ik wil een verzameling kopiëren binnen de dezelfdedatabase en deze een . geven
andere naam – maak in feite een momentopname.

Wat is de beste manier om dit te doen? Is er een bevel, of moet ik?
elk record om de beurt kopiëren?

Ik ben op de hoogte van de opdracht cloneCollection, maar het lijkt te zijn voor
alleen naar een andere server kopiëren.

Ik ben ook op de hoogte van mongoimporten mongoexport, maar aangezien ik dit via PHP doe, wil ik liever niet naar de shell bellen.


Antwoord 1, autoriteit 100%

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

Het is een stuk sneller dan veel inserts in een forEach-lus doen.


Antwoord 2, autoriteit 24%

Je hebt een paar opties, maar de snelste is:

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

of

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

of in php:

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

daarna heb je

mongo db < script.js

waar, zoals weergegeven in de mongo-documenten, script.js bevat zoiets als:

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

De langzaamste (in een orde van grootte of meer) manier om een ​​verzameling te kopiëren, is door het native php-stuurprogramma te gebruiken – simpelweg vanwege het verplaatsen van informatie. Maar u kunt de bovenstaande mongo-query uitvoeren als u cli-aanroepen absoluut wilt vermijden met behulp van de db functieuitvoeren.


Antwoord 3, autoriteit 6%

Opmerking:Lees het antwoord Updates, ze zijn belangrijk!


De meest eenvoudige & efficiënte manier is door copyTo()te gebruiken, zodat u kan gebruiken:

db.source.copyTo("target"); 

& als "target"niet bestaat, wordt het aangemaakt

— Bijwerken —

Volgens CopyTo Documentation, omdat CopyTo()gebruikt eval intern, de kopieerbewerkingen zullen alle andere bewerkingen op de mongod-instantie blokkeren. Het mag dus niet worden gebruikt in een productieomgeving.

— Bijwerken —

Omdat CopyTo()gebruikt eval()intern & eval()is verouderd sinds versie 3.0, dus CopyTo()is ook verouderd sinds versie 3.0.


Antwoord 4

Eerste optie (met mongo dump)

  1. Haal een dump uit de collectie

    mongodump -d db -c source_collection

  2. Herstellen uit verzameling

    mongorestore -d db -c target_collection dir=dump/db_name/source_collection.bson

Tweede optie

  1. Hardloopaggregaat

    db.getCollection(‘source_collection’).aggregate([ { $match: {“emailAddress” : “[email protected]”} }, { $out: “target_collection” } ])

Derde optie (langzaamste)

  1. Een for-lus doorlopen

    db.getCollection(‘source_collection’).find().forEach(function(docs){
    db.getCollection(‘target_collection’).insert(docs);
    })
    print(“Terugdraaien voltooid!”);


Antwoord 5

In aanvulling op de AD7six 1st-oplossing, moet u, als u mongoexport / import gebruikt, zeker zijn van uw verzamelingsgegevenstypen en mongo-configuratie, zoals hier wordt uitgelegd: http://docs.mongodb.org/manual/reference/mongodb-extended-json/


Antwoord 6

Dit is mijn implementatie in 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])

Antwoord 7

De snelste manier is db.collection.copyTo().

Houd er rekening mee dat het verouderd is sinds versie 3.0.


Antwoord 8

U kunt de functie copyDatabase in de mongo-shell gebruiken:

http://docs.mongodb.org/manual/tutorial /copy-databases-between-instances/

Other episodes