【问题标题】:Duplicate a mongodb collection复制一个 mongodb 集合
【发布时间】:2013-10-21 12:08:02
【问题描述】:

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

【问题讨论】:

标签: c# mongodb mongodb-.net-driver


【解决方案1】:

没有使用 C# 驱动程序复制集合的内置方法,但您仍然可以很简单地做到这一点:

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

但是请注意,这不会从源集合中复制任何索引。 shell 的copyTo 方法也有同样的限制,所以很可能实现类似。

【讨论】:

  • MongoVUE 重复集合也不会复制任何索引。所以他们很可能也是这样做的。
  • “不会复制任何索引”是什么意思?
  • @wuyts 在源集合上创建的任何索引都不会存在于副本中。您必须手动或使用单独的代码在副本上重新创建它们。
【解决方案2】:

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

复制集合的最快方法显然是使用具有$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 大小的进度条,它将不再起作用。

【讨论】:

  • 我可以补充一点,我能够通过查找新创建的集合、找到 mongodb 创建的临时集合并监控其大小来构建进度条。但是,如果您有许多这些操作并行进行,则(据我所知)无法查看哪个临时集合对应于该特定聚合。我通过锁定创建和查找临时集合的部分来“解决”这个问题。它足够快,因为实际的聚合是同时运行的。
猜你喜欢
  • 2021-06-14
  • 2023-01-10
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
  • 2023-04-04
  • 2019-04-15
相关资源
最近更新 更多