有什么简单的方法吗?


当前回答

对于大容量的集合,可以使用Bulk.insert()

var bulk = db.getSiblingDB(dbName)[targetCollectionName].initializeUnorderedBulkOp();
db.getCollection(sourceCollectionName).find().forEach(function (d) {
    bulk.insert(d);
});
bulk.execute();

这将节省很多时间。 在我的例子中,我用1219个文档复制集合:iter vs Bulk(67秒vs 3秒)

其他回答

在我的例子中,我必须在新集合中使用旧集合中的属性子集。因此,我最终在对新集合调用insert时选择了这些属性。

db.<sourceColl>.find().forEach(function(doc) { 
    db.<newColl>.insert({
        "new_field1":doc.field1,
        "new_field2":doc.field2,
        ....
    })
});`

最好的方法是先做一个mongodump,然后再做mongorestore。您可以通过以下方式选择集合:

mongodump -d some_database -c some_collection

[可选地,压缩转储(zip some_database.zip some_database/* -r)并将其scp到其他地方]

然后恢复:

mongorestore -d some_other_db -c some_or_other_collection dump/some_collection.bson

some_or_other_collection中的现有数据将被保留。这样,您就可以将一个集合从一个数据库“附加”到另一个数据库。

在版本2.4.3之前,您还需要在复制数据后添加回索引。从2.4.3开始,这个过程是自动的,您可以使用——noIndexRestore禁用它。

如果RAM不是问题,使用insertMany比forEach循环快得多。

var db1 = connect('<ip_1>:<port_1>/<db_name_1>')
var db2 = connect('<ip_2>:<port_2>/<db_name_2>')

var _list = db1.getCollection('collection_to_copy_from').find({})
db2.collection_to_copy_to.insertMany(_list.toArray())

在MongoDB中将一个集合(myCollection1)从一个数据库复制到另一个数据库,

**Server1:**
myHost1.com 
myDbUser1
myDbPasword1
myDb1
myCollection1

outputfile:
myfile.json 

**Server2:**
myHost2.com 
myDbUser2
myDbPasword2
myDb2
myCollection2 

你可以这样做:

mongoexport  --host myHost1.com --db myDb1 -u myDbUser1  -p myDbPasword1 --collection myCollection1   --out  myfile.json 

然后:

mongoimport  --host myHost2.com --db myDb2 -u myDbUser2  -p myDbPasword2 --collection myCollection2   --file myfile.json 

另一种情况,使用CSV文件:

Server1:
myHost1.com 
myDbUser1
myDbPasword1
myDb1
myCollection1
fields.txt
    fieldName1
    fieldName2

outputfile:
myfile.csv

Server2:
myHost2.com 
myDbUser2
myDbPasword2
myDb2
myCollection2

你可以这样做:

mongoexport  --host myHost1.com --db myDb1 -u myDbUser1  -p myDbPasword1 --collection myCollection1   --out  myfile.csv --type=csv

在CSV文件中添加列类型(name1.decimal(),name1.string()..),然后:

mongoimport  --host myHost2.com --db myDb2 -u myDbUser2  -p myDbPasword2 --collection myCollection2   --file myfile.csv --type csv --headerline --columnsHaveTypes

有不同的方法来进行集合复制。注意,复制可以发生在同一个数据库、不同的数据库、分片数据库或mongod实例中。有些工具对于大型集合的复制是有效的。

使用$merge聚合: 将聚合管道的结果写入指定的集合。注意,复制可以跨数据库进行,甚至可以跨分片集合进行。创建一个新的集合或替换现有的集合。4.2新版功能。 例子:db.test。聚合([{$merge: {db: "newdb", coll: "newcoll"}}])

带$out的聚合: 将聚合管道的结果写入指定的集合。注意,复制只能在同一个数据库中进行。创建一个新的集合或替换现有的集合。 例子:db.test。聚合([{$out: "newcoll"}])

Mongoexport和mongoimport: 这些是命令行工具。 mongoexport生成集合数据的JSON或CSV导出。导出的输出使用mongoimport作为目标集合的源。

mongodb和mongorestore: 这些是命令行工具。 mongodb实用程序用于创建数据库或集合内容的二进制导出。mongorestore程序从mongodump创建的二进制数据库转储中加载数据到目标。

db.cloneCollection (): 将一个集合从远程mongod实例复制到当前mongod实例。 4.2版后已移除。

db.collection.copyTo (): 将所有文档从集合复制到新集合(在同一数据库中)。 3.0版后已移除。从4.2版开始,MongoDB此命令无效。

注意:除非上面的命令是从mongo shell运行的。

参考:MongoDB手册。

您也可以使用最喜欢的编程语言(如Java)或环境(如NodeJS),使用适当的驱动程序软件编写程序来执行复制-这可能涉及使用查找和插入操作或其他方法。这个查找-插入也可以从mongo shell执行。

您还可以使用像MongoDB Compass这样的GUI程序进行集合复制。