2012-12-17 77 views

回答

26

已經做到了這一點,最好的辦法(考慮到集合的名稱與_backup結束)可能是有使用mongorestore:http://docs.mongodb.org/manual/reference/mongorestore/

然而,在這種情況下,它依賴。如果集合unsharded可以使用renameCollectionhttp://docs.mongodb.org/manual/reference/command/renameCollection/),也可以使用(在JavaScript代碼)的更多的手工方法:

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

這些都是這樣做的最常用的方法。

3

也有用: 到收藏導出到JSON文件

mongoexport --collection collection1_backup --out collection1.json 

從JSON文件導入集合

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

導入從備份/轉儲文件單個集合一個需要轉換* .bson file to * .json 使用

bsondump collection1_backup.bson > collection1_backup.json 
+8

一般來說,複製集合時最好使用'mongodump'和'mongorestore',因爲將文檔轉換爲JSON並返回可能會影響[數據類型保真度](http://docs.mongodb.org/manual /管理/進出口/#數據類型保真度)。 BSON中存在一些數據類型,它們可以具有[JSON中的不同表示形式](http://www.mongodb.org/display/DOCS/Mongo+Extended+JSON),其中沒有嚴格的JSON等效。根據您的數據,使用'mongoimport' /'mongoexport'也許可以,但這是一個需要注意的重要警告。 – Stennie

+0

@Stennie注意到做一個mongodump/mongorestore會保留索引也很重要。因此,如果您嘗試在集合之間複製文檔,您將無法恢復。 如果您要在集合之間複製文檔,應使用mongoexport和mongoimport。 – ivandov

+0

@ivandov你可以用'mongorestore --noIndexRestore'跳過重新創建索引(除了所需的_id'索引)。請注意,'mongorestore'(如MongoDB 3.4)只能插入;如果存在具有相同'_id'的文檔,則不會更新或替換它。 'mongoimport'工具支持upserts(在3.4中,合併),但是使用文本格式而不是MongoDB的本地BSON格式。如果您想在MongoDB部署之間重新創建數據(以及可選的集合元數據),那麼'mongodump'和'mongorestore'仍然是推薦的選項。 – Stennie

0

使用Java驅動程序

嘗試以下之一:

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

更好的辦法是使用.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

您可以使用簡單的命令來備份MongoDB的收藏

db.sourceCollectionName.copyTo('targetCollectionName') 

您的targetCollectionName必須處於Single(')或Double(「)報價

注:

的db.collection.copyTo()方法使用eval命令內部。由於 的結果,db.collection.copyTo()操作採用全局鎖 ,該鎖阻止所有其他讀取和寫入操作,直到 db.collection.copyTo()完成。

+0

這不適用於Sharded集合,順便說一句 – oshaiken

相關問題