如何将集合从localhost复制到远程mongo实例

时间:2016-06-23 11:28:07

标签: mongodb mongodb-query pymongo

db.runCommand({cloneCollection : "newdb.rep", from:"localhost:27017"})

我现在已连接到远程Mongo实例。 但是我知道这主要用于将集合从远程复制到本地而不是相反的方式

2 个答案:

答案 0 :(得分:1)

您可以使用此脚本,该脚本将连接到本地和远程数据库。

一些信息here

然后通过集合进行迭代并插入1000个文档中。

var localConnection = connect("localhost:27017/myDatabase");
var destinationConnection = connect("localhost:27020/myDatabase");

var documentLimit = 1000;
var docCount = localConnection.find({}).count();

var chunks = docCount / documentLimit;

for (var i = 0; i <= chunks; i++) {

    var bulk = destinationConnection.initializeUnorderedBulkOp();

    localConnection .find({}).snapshot()
    .limit(documentLimit).forEach(function (doc) {
        bulk.insert(doc);
    });

    bulk.execute()
}

答案 1 :(得分:0)

@ profesor79的脚本不适用于较新版本的MongoDB,并且不适用于包含1000多个文档的集合,并且没有进行任何更改。它不使用skip(),因此MongoDB在尝试再次覆盖前1000个文档时会引发错误。

我已成功在包含约20000个文档的集合上使用以下脚本。

var localConnection = connect(
  "<db_user>:<db_password>@localhost:27017/<db_name>"
);
var destinationConnection = connect(
  "<db_user>:<db_password>@<remote_host>:<remote_port>/<remote_db>"
);

var documentLimit = 1000;
var docCount = localConnection.collection_name.count();

var chunks = docCount / documentLimit;

for (var i = 0; i <= chunks; i++) {
  var bulk = destinationConnection.collection_name.initializeUnorderedBulkOp();

  localConnection.collection_name
    .find({})
    // after each iteration skip 1000, 2000 and so on...
    .skip(i*documentLimit)
    .limit(documentLimit)
    .forEach(function(doc) {
      bulk.insert(doc);
    });

  bulk.execute();
}

提供您自己的本地和目标连接字符串以及documentLimit(即要作为大块处理的文档数),并且应该可以正常工作。