it-swarm.com.de

So kopieren Sie eine Sammlung von einer Datenbank in eine andere in MongoDB

Gibt es eine einfache Möglichkeit, dies zu tun?

190
EasonBlack

Momentan gibt es in MongoDB keinen Befehl, der dies tun würde. Bitte beachten Sie das JIRA-Ticket mit zugehöriger Funktionsanforderung .

Sie könnten so etwas tun:

db.<collection_name>.find().forEach(function(d){ db.getSiblingDB('<new_database>')['<collection_name>'].insert(d); });

Bitte beachten Sie, dass die beiden Datenbanken den gleichen Mongod verwenden müssen, damit dies funktioniert. 

Außerdem können Sie aus einer Datenbank einen Mongodump einer Sammlung erstellen und dann die Sammlung in die andere Datenbank mongorestore.

172
Jason McCay

Der beste Weg ist, einen Mongodump und dann den Mongorestore zu machen.

Sie können die Sammlung auswählen über:

mongodump -d some_database -c some_collection

[Optional können Sie den Speicherauszug (Zip some_database.Zip some_database/* -r) und scp an 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 außerdem Ihre Indizes nach dem Kopieren Ihrer Daten erneut hinzufügen. Ab 2.4.3 ist dieser Vorgang automatisch und kann mit --noIndexRestore deaktiviert werden.

256
Ben

Eigentlich ist is ein Befehl zum Verschieben einer Sammlung von einer Datenbank in eine andere. Es wird einfach nicht "Verschieben" oder "Kopieren" genannt.

Um eine Sammlung zu kopieren, können Sie sie auf 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.

76
Anuj Gupta

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 die Mongo Shell

use test
var db2 = connect('localhost:27017/test2')

machen Sie eine normale Suche und kopieren Sie die ersten 20 Datensätze nach test2.

db.customer.find().limit(20).forEach(function(p) { db2.customer.insert(p); });

oder filtern Sie nach einigen Kriterien

db.customer.find({"active": 1}).forEach(function(p) { db2.customer.insert(p); });

Ändern Sie einfach den localhost in IP oder Hostname, um eine Verbindung zum Remote-Server herzustellen. Ich verwende dies, um Testdaten zum Testen in eine Testdatenbank zu kopieren.

22
wayne

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/

18
es cologne

Ich würde normalerweise tun:

use sourcedatabase;
var docs=db.sourcetable.find();
use targetdatabase;
docs.forEach(function(doc) { db.targettable.insert(doc); });
18
amenadiel

Sie können das Aggregationsframework verwenden, um Ihr Problem zu beheben

db.oldCollection.aggregate([{$out : "newCollection"}])

Es wird darauf hingewiesen, dass Indizes aus oldCollection nicht in newCollection kopiert werden.

5

Ich weiß, dass diese Frage beantwortet wurde. Ich persönlich würde jedoch keine Antwort auf @JasonMcCays geben, da Cursor ablaufen und dies eine unendliche Cursor-Schleife verursachen kann, wenn die Sammlung noch verwendet wird. Stattdessen würde ich eine Momentaufnahme () verwenden:

http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Monio+Datenbank

@bens Antwort ist auch eine gute und funktioniert gut für Hot-Backups von Sammlungen nicht nur das, sondern mongorestore muss nicht den gleichen mongod teilen.

5
Sammaye

Dies kann nur ein Sonderfall sein, aber für eine Sammlung von 100.000 Dokumenten mit zwei zufälligen String-Feldern (Länge beträgt 15-20 Zeichen) ist die Verwendung eines dummen Mapreduce fast doppelt so schnell wie das Suchen/Einfügen/Kopieren.

db.coll.mapReduce(function() { emit(this._id, this); }, function(k,vs) { return vs[0]; }, { out : "coll2" })
5
Vajk Hermecz

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)
4
vbhakta

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 secs vs 3 secs)

3
nametal

Wenn RAM kein Problem ist, ist insertMany viel schneller als 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())
2
TheNeverLander

Das löst Ihr Problem zwar nicht, aber die Mongodb-Shell verfügt über eine copyTo -Methode, die eine Collection in eine andere in derselben Datenbank kopiert:

db.mycoll.copyTo('my_other_collection');

Es wird auch von BSON in JSON übersetzt, so dass mongodump/mongorestore der beste Weg ist, wie andere gesagt haben.

2
Roberto

Sie können Robomongo immer verwenden. Ab Version 0.8.3 gibt es ein Werkzeug, das dies durch Klicken mit der rechten Maustaste auf die Sammlung und Auswählen von "Sammlung in Datenbank kopieren" ermöglicht.

Weitere Informationen finden Sie unter http://blog.robomongo.org/whats-new-in-robomongo-0-8-3/

Diese Funktion wurde aufgrund der fehlerhaften Natur in 0.8.5 entfernt entfernt. Sie müssen daher 0.8.3 oder 0.8.4 verwenden, wenn Sie es ausprobieren möchten.

1
dross

Falls einige Heroku-Benutzer hier stolpern und wie ich einige Daten aus der Staging-Datenbank in die Produktionsdatenbank kopieren möchten oder umgekehrt, machen Sie es ganz bequem (NB: Ich hoffe, es gibt keine Tippfehler, ich kann es nicht überprüfen.) Ich versuche 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"
1
Timo

In meinem Fall musste ich in meiner neuen Sammlung eine Teilmenge von Attributen aus der alten Sammlung verwenden. Am Ende habe ich diese Attribute ausgewählt, während ich in der neuen Kollektion insert aufgerufen habe.

db.<sourceColl>.find().forEach(function(doc) { 
    db.<newColl>.insert({
        "new_field1":doc.field1,
        "new_field2":doc.field2,
        ....
    })
});`
0
dranga

verwenden Sie "Studio3T for MongoDB" , das über Export- und Import-Tools verfügt, indem Sie auf die Datenbank, Sammlungen oder eine bestimmte Sammlung klicken Download-Link: https://studio3t.com/download/

0
A.Hamzavi

Dies kann mit der Mongo-Methode db.copyDatabase durchgeführt werden:

db.copyDatabase(fromdb, todb, fromhost, username, password)

Referenz: http://docs.mongodb.org/manual/reference/method/db.copyDatabase/

0
nnamdi