使用 C# 在同一台服务器上复制 Mongodb 中的集合的正确方法是什么?MongoVUE 有一个选项“重复集合”,C# 有类似的东西吗?
问问题
7593 次
2 回答
5
没有使用 C# 驱动程序复制集合的内置方法,但您仍然可以非常简单地执行此操作:
var source = db.GetCollection("test");
var dest = db.GetCollection("testcopy");
dest.InsertBatch(source.FindAll());
但是请注意,这不会从源集合中复制任何索引。shell 的copyTo
方法也有同样的限制,所以很可能实现类似。
于 2013-10-21T13:38:54.883 回答
5
我遇到了完全相同的问题,但是虽然接受的答案有效,但我还需要尽快解决。
复制集合的最快方法显然是使用带有$out
管道阶段的聚合。这样,您不必下载所有文档然后重新上传它们,它们只是复制到数据库中。
这在 mongo shell 中执行很简单:
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);
事实证明这非常快(复制 5M 文档大约需要 3 分钟),并且在 db 和运行上述代码的应用程序之间没有数据传输。一个缺点是它创建了一个临时集合,因此resultCollection
在操作完成之前它将为空(或不存在)。因此,如果您有一个基于大小的进度条,resultCollection
它将不再起作用。
于 2017-04-27T13:03:31.730 回答