复制一个 mongodb 集合

本文关键字:一个 mongodb 集合 复制 | 更新日期: 2023-09-27 18:36:09

使用 C# 在同一服务器上复制 Mongodb 中的集合的正确方法是什么?MongoVUE有一个选项"重复集合",C#有类似的东西吗?

复制一个 mongodb 集合

没有使用

C# 驱动程序复制集合的内置方法,但您仍然可以非常简单地执行以下操作:

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

但请注意,这不会从源集合复制任何索引。 shell 的 copyTo 方法具有相同的限制,因此它可能以类似的方式实现。

我遇到了完全相同的问题,但是虽然接受的答案有效,但我还需要尽快完成它。

复制集合的最快方法显然是使用具有$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 分钟),并且数据库和运行上述代码的应用程序之间不会传输任何数据。一个缺点是它会创建一个临时集合,因此在操作完成之前,resultCollection将为空(或不存在)。因此,如果您有一个基于resultCollection大小的进度条,它将不再起作用。