2013-10-21 168 views
0

什麼是在使用C#在同一臺服務器上覆制Mongodb中的集合的正確方法? MongoVUE有一個選項'重複集合',是否有類似的C#?複製一個mongodb集合

+0

可能的重複[如何將集合複製到MongoDB中的另一個數據庫?](http://stackoverflow.com/questions/11554762/how-can-i-copy-collection-to-another-database-in- mongodb) – Philipp

+0

這篇文章是關於複製到另一個數據庫。我想複製我的收藏在同一個數據庫(只是一個副本的集體) – wuyts

+0

檢查這一個接受的答案http://stackoverflow.com/questions/8933307/clone-a-collection-in-mongodb – joao

回答

3

沒有一個內置的方式來複制與C#驅動程序的集合,但你仍然可以做到這一點很簡單的:

var source = db.GetCollection("test"); 
var dest = db.GetCollection("testcopy"); 
dest.InsertBatch(source.FindAll()); 

但是請注意,這不會複製任何索引來自源集合。 shell的copyTo方法具有相同的限制,所以它可能以相似的方式實現。

+0

MongoVUE重複集合也不會複製任何索引。所以他們很可能也是這樣做的。 – leojg

+0

你的意思是'不會複製任何索引'? – wuyts

+0

@wuyts副本上不存在在源集合上創建的任何索引。您必須手動或使用單獨的代碼在副本上重新創建這些副本。 – JohnnyHK

0

我有完全相同的問題,但是當接受的答案有效時,我也需要儘快完成。

複製集合的最快方法顯然是使用具有$out流水線階段的聚合。這樣,您不必下載所有文檔,然後重新上傳它們,它們只是複製到數據庫中。

這是微不足道的蒙戈外殼內執行:

db.originalColl.aggregate([ { $match: {} }, { $out: "resultColl"} ]); 

不過,我有很多的麻煩,從C#運行此。由於eval現在已被棄用,因此不能只將上述內容填充到要在服務器上執行的字符串中。相反,您需要構建代表上述代碼的Bson文檔。

以下是我做這工作:

var aggDoc = new Dictionary<string,object> 
{ 
    {"aggregate" , "originalCollection"}, 
    {"pipeline", new [] 
     { 
      new Dictionary<string, object> { { "$match" , new BsonDocument() }}, 
      new Dictionary<string, object> { { "$out" , "resultCollection"}} 
     } 
    } 
}; 

var doc = new BsonDocument(aggDoc); 
var command = new BsonDocumentCommand<BsonDocument>(doc); 
db.RunCommand(command); 

這原來是非常快的(大約3分鐘複製5M的文件),並且沒有數據的數據庫,並運行上面的代碼應用程序之間傳送。一個缺點是它會創建一個臨時集合,所以resultCollection將在操作完成之前爲空(或不存在)。所以如果你有一個基於resultCollection大小的進度條,它將不再起作用。

相關問題