Gibt es eine einfache Möglichkeit, dies zu tun?
Gibt es eine einfache Möglichkeit, dies zu tun?
Antworten:
Im Moment gibt es in MongoDB keinen Befehl, der dies tun würde. Bitte beachten Sie das JIRA-Ticket mit der entsprechenden Funktionsanforderung .
Sie könnten so etwas tun wie:
db.<collection_name>.find().forEach(function(d){ db.getSiblingDB('<new_database>')['<collection_name>'].insert(d); });
Bitte beachten Sie, dass sich die beiden Datenbanken damit teilen müssen, damit dies funktioniert.
Außerdem können Sie einen Mongodump einer Sammlung aus einer Datenbank erstellen und dann die Sammlung in der anderen Datenbank speichern.
Der beste Weg ist, einen Mongodump und dann einen Mongorestore zu machen.
Sie können die Sammlung auswählen über:
mongodump -d some_database -c some_collection
[Optional können Sie den dump ( zip some_database.zip some_database/* -r
) und an scp
anderer Stelle komprimieren]
Dann stellen Sie es wieder her:
mongorestore -d some_other_db -c some_or_other_collection dump/some_collection.bson
Vorhandene Daten in some_or_other_collection
bleiben erhalten. Auf diese Weise können Sie eine Sammlung von einer Datenbank an eine andere "anhängen".
Vor Version 2.4.3 müssen Sie Ihre Indizes auch wieder hinzufügen, nachdem Sie Ihre Daten kopiert haben. Ab 2.4.3 erfolgt dieser Vorgang automatisch und Sie können ihn mit deaktivieren --noIndexRestore
.
Tatsächlich gibt es einen Befehl zum Verschieben einer Sammlung von einer Datenbank in eine andere. Es heißt einfach nicht "verschieben" oder "kopieren".
Um eine Sammlung zu kopieren, können Sie sie in derselben Datenbank klonen und dann den Klon verschieben.
Klonen:
> use db1
> db.source_collection.find().forEach( function(x){db.collection_copy.insert(x)} );
Bewegen:
> use admin
switched to db admin
> db.runCommand({renameCollection: 'db1.source_collection', to: 'db2.target_collection'}) // who'd think rename could move?
Die anderen Antworten eignen sich besser zum Kopieren der Sammlung. Dies ist jedoch besonders nützlich, wenn Sie sie verschieben möchten.
'db1.source_collection'
Ich würde die Verbindungsfunktion in Mongo Cli Mongo Doc missbrauchen . Das bedeutet, dass Sie eine oder mehrere Verbindungen herstellen können. Wenn Sie die Kundensammlung von test nach test2 auf demselben Server kopieren möchten. Zuerst starten Sie Mongo Shell
use test
var db2 = connect('localhost:27017/test2')
Führen Sie eine normale Suche durch und kopieren Sie die ersten 20 Datensätze nach test2.
db.customer.find().limit(20).forEach(function(p) { db2.customer.insert(p); });
oder nach bestimmten Kriterien filtern
db.customer.find({"active": 1}).forEach(function(p) { db2.customer.insert(p); });
Ändern Sie einfach den lokalen Host in IP oder Hostname, um eine Verbindung zum Remote-Server herzustellen. Ich verwende dies, um Testdaten zum Testen in eine Testdatenbank zu kopieren.
Wenn zwischen zwei Remote-Mongod-Instanzen, verwenden Sie
{ cloneCollection: "<collection>", from: "<hostname>", query: { <query> }, copyIndexes: <true|false> }
siehe http://docs.mongodb.org/manual/reference/command/cloneCollection/
copyIndexes
Optionsfeld wird tatsächlich nicht berücksichtigt. Die Indizes werden immer kopiert. Siehe SERVER-11418
Für große Sammlungen können Sie Bulk.insert () verwenden.
var bulk = db.getSiblingDB(dbName)[targetCollectionName].initializeUnorderedBulkOp();
db.getCollection(sourceCollectionName).find().forEach(function (d) {
bulk.insert(d);
});
bulk.execute();
Dies spart viel Zeit . In meinem Fall kopiere ich die Sammlung mit 1219 Dokumenten: iter vs Bulk (67 Sekunden vs 3 Sekunden)
Sie können das Aggregationsframework verwenden, um Ihr Problem zu beheben
db.oldCollection.aggregate([{$out : "newCollection"}])
Es ist zu beachten, dass Indizes aus oldCollection nicht in newCollection kopiert werden.
Ich weiß, dass diese Frage beantwortet wurde, aber ich persönlich würde @JasonMcCays nicht beantworten, da Cursor streamen und dies zu einer Endlosschleife führen kann, wenn die Sammlung noch verwendet wird. Stattdessen würde ich einen Schnappschuss () verwenden:
http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database
@bens Antwort ist auch eine gute und funktioniert gut für Hot-Backups von Sammlungen, nicht nur das, sondern Mongorestore muss nicht das gleiche Mongod teilen.
Dies mag nur ein Sonderfall sein, aber für eine Sammlung von 100.000 Dokumenten mit zwei zufälligen Zeichenfolgenfeldern (Länge 15 bis 20 Zeichen) ist die Verwendung einer dummen Mapreduce fast doppelt so schnell wie find-insert / copyTo:
db.coll.mapReduce(function() { emit(this._id, this); }, function(k,vs) { return vs[0]; }, { out : "coll2" })
Wenn Sie Pymongo verwenden, müssen Sie beide Datenbanken auf demselben Mongod haben. Ich habe Folgendes getan:
db = ursprüngliche Datenbank
db2 = Datenbank, in die kopiert werden soll
cursor = db["<collection to copy from>"].find()
for data in cursor:
db2["<new collection>"].insert(data)
Dies wird Ihr Problem nicht lösen, aber die Mongodb-Shell verfügt über eine copyTo
Methode, mit der eine Sammlung in eine andere in derselben Datenbank kopiert wird :
db.mycoll.copyTo('my_other_collection');
Es wird auch von BSON in JSON übersetzt, also mongodump
/ mongorestore
sind der beste Weg, wie andere gesagt haben.
Wenn RAM kein Problem ist, insertMany
ist die Verwendung viel schneller als die forEach
Schleife.
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())
Für den Fall, dass einige Heroku-Benutzer hier stolpern und wie ich einige Daten aus der Staging-Datenbank in die Produktionsdatenbank kopieren möchten oder umgekehrt, gehen Sie wie folgt vor (Hinweis: Ich hoffe, es gibt keine Tippfehler, kann sie nicht überprüfen.) Ich werde versuchen, die Gültigkeit des Codes so schnell wie möglich zu bestätigen.
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"
Sie können immer Robomongo verwenden. Ab Version 0.8.3 gibt es ein Tool, das dies tun kann, indem Sie mit der rechten Maustaste auf die Sammlung klicken und "Sammlung in Datenbank kopieren" auswählen.
Weitere Informationen finden Sie unter http://blog.robomongo.org/whats-new-in-robomongo-0-8-3/.
Diese Funktion wurde in 0.8.5 aufgrund ihres fehlerhaften Charakters entfernt, sodass Sie 0.8.3 oder 0.8.4 verwenden müssen, wenn Sie sie ausprobieren möchten.
In meinem Fall musste ich eine Teilmenge von Attributen aus der alten Sammlung in meiner neuen Sammlung verwenden. Also habe ich diese Attribute ausgewählt, während ich insert für die neue Sammlung aufgerufen habe.
db.<sourceColl>.find().forEach(function(doc) {
db.<newColl>.insert({
"new_field1":doc.field1,
"new_field2":doc.field2,
....
})
});`
Verwenden Sie "Studio3T for MongoDB" mit Export- und Import-Tools, indem Sie auf Datenbank, Sammlungen oder einen bestimmten Link zum Herunterladen von Sammlungen klicken: https://studio3t.com/download/
Dies kann mit Mongos db.copyDatabase
Methode erfolgen:
db.copyDatabase(fromdb, todb, fromhost, username, password)
Referenz: http://docs.mongodb.org/manual/reference/method/db.copyDatabase/