2012-12-17 10 views

Odpowiedz

26

Najlepszym sposobem, aby zrobić to (biorąc pod uwagę nazwę kolekcji kończy _backup) jest ewentualnie mieć używany mongorestore: http://docs.mongodb.org/manual/reference/mongorestore/

Jednak w tym przypadku to zależy. Jeśli kolekcja jest unsharded można użyć renameCollection (http://docs.mongodb.org/manual/reference/command/renameCollection/) lub można użyć bardziej ręczny sposób (w kodzie JavaScript):

db.collection1.drop(); // Drop entire other collection 
db.collection1_backup.find().forEach(function(doc){ 
    db.collection1.insert(doc); // start to replace 
}); 

Są to najczęstsze sposoby na zrobienie tego.

3

przydatny również: wyeksportować do pliku json kolekcję

mongoexport --collection collection1_backup --out collection1.json 

zaimportować kolekcji z pliku json

mongoimport --db test --collection collection1 --file collection1.json 

importować jeden zbiór z pliku kopii zapasowej/zrzutu jeden potrzeby konwertowania * .bson złożyć do * .json za pomocą

bsondump collection1_backup.bson > collection1_backup.json 
+8

Generalnie lepiej jest używać 'mongodump' i' mongorestore' podczas kopiowania kolekcji, ponieważ konwertowanie dokumentów do JSON iz powrotem może wpływać na [wierność typu danych] (http://docs.mongodb.org/manual)/administration/import-export/# data-type-fidelity). Istnieje kilka typów danych, które istnieją w BSON, które mogą mieć [inną reprezentację w JSON] (http://www.mongodb.org/display/DOCS/Mongo+Extended+JSON), gdzie nie ma ścisłego odpowiednika JSON. Użycie 'mongoimport' /' mongoexport' może być OK w zależności od twoich danych, ale jest to ważne zastrzeżenie, o którym musisz wiedzieć. – Stennie

+0

@Stennie Należy również pamiętać, że robienie mongodump/mongorestore zachowa indeksy. Jeśli więc próbujesz zduplikować dokumenty między kolekcjami, przywrócenie nie będzie możliwe. Mongoexport i mongoimport powinny być używane, jeśli próbujesz skopiować dokumenty między kolekcjami. – ivandov

+0

@ivand Można pominąć tworzenie indeksów (oprócz wymaganego indeksu '_id') za pomocą' mongorestore --noIndexRestore'. Zauważ, że 'mongorestore' (jak w MongoDB 3.4) zawiera tylko inserty; jeśli istnieje dokument z tym samym "_id", nie zostanie on zaktualizowany ani zastąpiony. Narzędzie 'mongoimport' obsługuje wersje upart (i 3.4, scala), ale działa z formatami tekstowymi zamiast natywnego formatu BSON MongoDB. 'mongodump' i' mongorestore' są nadal zalecanymi opcjami, jeśli chcesz odtworzyć dane (i opcjonalnie metadane kolekcji) identycznie między wdrożeniami MongoDB. – Stennie

0

Używanie sterownika Java

Spróbuj poniżej jeden:

public void copyTo(String db,String sourceCollection,String destinationCollection,int limit) throws   
UnknownHostException { 

    MongoClient mongo = new MongoClient("localhost", 27017); 
    DB database = mongo.getDB(db); 
    DBCollection collection = database.getCollection(sourceCollection); 
    DBCursor dbCursor = collection.find().limit(limit); 
    List<DBObject> list = dbCursor.toArray(); 
    DBCollection destination = database.getCollection(destinationCollection); 
    destination.insert(list, WriteConcern.NORMAL); //WRITE CONCERN is based on your requirment. 

} 
1

Lepszy sposób byłoby użyć .toArray()

db.collection1.drop(); // Drop entire other collection 

// creates an array which can be accessed from "data" 
db.collection1_backup.find().toArray(function(err, data) { 

     // creates a collection and inserting the array at once 
     db.collection1.insert(data); 
}); 
0

Można użyć prostego polecenia do tworzenia kopii zapasowych MongoDB Collection

db.sourceCollectionName.copyTo('targetCollectionName') 

Twoja targetCollectionName musi być w trybie Single (") lub Double" (") Cytat

Uwaga:

Sposób db.collection.copyTo() stosuje wewnętrznie polecenia eval. Po uzyskaniu wyniku operacja db.collection.copyTo() pobiera globalną blokadę , która blokuje wszystkie inne operacje odczytu i zapisu, dopóki nie zakończy się operacja db.collection.copyTo() .

+0

To nie działa z Sharded kolekcje, btw – oshaiken

Powiązane problemy