2013-10-21 132 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大小的进度条,它将不再起作用。

相关问题