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 mongoimport
en 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)
-
Haal een dump uit de collectie
mongodump -d db -c source_collection
-
Herstellen uit verzameling
mongorestore -d db -c target_collection dir=dump/db_name/source_collection.bson
Tweede optie
-
Hardloopaggregaat
db.getCollection(‘source_collection’).aggregate([ { $match: {“emailAddress” : “[email protected]”} }, { $out: “target_collection” } ])
Derde optie (langzaamste)
-
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/