Mongodb 放置现有集合。 示例:db.test.aggregate([{$out:“newcoll”}])

Mongodb 放置现有集合。 示例:db.test.aggregate([{$out:“newcoll”}]),mongodb,mongo-collection,Mongodb,Mongo Collection,mongoexport和mongoimport: 这些是命令行工具。 mongoexport生成收集数据的JSON或CSV导出。使用mongoimport将导出的输出用作目标集合的源 mongodump和mongorestore: 这些是命令行工具。 mongodump实用程序用于创建数据库或集合内容的二进制导出。mongorestore程序将数据从由mongodump创建的二进制数据库转储加载到目标 db.cloneCollection(): 将集合从远程mongod实例复制到当前mongod

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

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

db.cloneCollection(): 将集合从远程
mongod
实例复制到当前
mongod
实例。 自版本4.2以来已弃用

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

注意:除非另有说明,否则上述命令从
mongo
shell运行

参考:

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


您还可以使用诸如MongoDB Compass之类的GUI程序进行集合复制。

如其他答案所示,最快的解决方案应该是
mongodump/mongorestore
。无需将转储保存到本地磁盘,您可以通过管道将转储直接传送到mongorestore:

mongodump --db=some_database --collection=some_collection --archive=- | mongorestore --nsFrom="some_database.some_collection" --nsTo="some_or_other_database.some_or_other_collection" --archive=-
在运行共享集群的情况下,默认情况下不会对新集合进行分片。所有数据最初都会写入主碎片。这可能会导致磁盘空间出现问题,并为群集增加额外负载。在导入数据之前,请按以下方式改进收集:

sh.shardCollection("some_or_other_database.some_or_other_collection", { <shard_key>: 1 });
db.getSiblingDB("config").getCollection("chunks").aggregate([
   { $match: { ns: "some_database.some_collection"} },
   { $sort: { min: 1 } },
   { $skip: 1 }
], { allowDiskUse: true }).forEach(function (chunk) {
   sh.splitAt("some_or_other_database.some_or_other_collection", chunk.min)
})
sh.shardCollection(“some_or_other_数据库。some_or_other_集合”,{:1});
db.getSiblingDB(“config”).getCollection(“chunks”).aggregate([
{$match:{ns:{some_database.some_collection},
{$sort:{min:1}},
{$skip:1}
],{allowDiskUse:true}).forEach(函数(块){
sh.splitAt(“一些或其他数据库。一些或其他集合”,chunk.min)
})
要在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 
mongoexport  --host myHost1.com --db myDb1 -u myDbUser1  -p myDbPasword1 --collection myCollection1   --out  myfile.csv --type=csv
然后:

另一种情况是,使用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.json 
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


请注意,如果您在这个过程中将BSON文档解码为JSON,那么某些文档可能会发生类型更改。mongodump/mongorestore通常是更好的方法。同意。这更像是一个玩弄贝壳的有趣建议。此外,它不会带来索引。如果我这样做的话,我每次都会做mongodump/mongorestore。谢谢。请注意,代码中有一个输入错误,而不是关闭getSiblingDB函数。下面是更正后的代码:db..find().forEach(函数(d){db.getSiblingDB('')['').insert(d);});这对于在测试运行之间从黄金拷贝重置测试mongodb非常有效。不必硬编码集合名称,您可以使用db.getCollection(name).find().forEach对所有要复制的集合名称执行for循环,并提供一个具有db.getSiblingDB(“otherdb”).getCollection(name).insert(d)的函数。这对大型集合有效吗?正如我对Jason建议的评论一样,请注意,如果在JS shell中进行复制,BSON文档将在复制过程中解码为JSON,因此某些文档可能会发生类型更改。对于在数据库之间(尤其是在同一服务器上)复制大量数据,也有类似的注意事项,这将是一个较慢的过程。所以mongodump/mongorestore FTW:)太好了。不幸的是,Mongo似乎没有提到这个方法。是的,我知道,但是MongoDB shell非常棒,如果您键入db.collname。[TAB]您将看到集合对象上所有可用的方法。此技巧适用于所有其他对象。问题是这些命令缺少帮助!虽然省略了方法调用的paren,但能够查看代码还是很有用的。遗憾的是,自3.0版以来,该命令已被弃用。实际上,
copyIndexes
选项字段不受尊重。索引总是被复制的。请参阅SERVER-11418将其包装在db.runCommand()中,即db.runCommand({cloneCollection:,from:,query:{})如何将其用于从一个远程mongo到另一个远程mongo的增量更新?我整天都在向一个mongo实例添加用户数据。在一天结束时,我需要将新添加的行转移到另一个mongo实例。如何实现这一点?@NishantKumar尝试在查询中设置:{}此代码:$where:function(){today=new Date();//today.setHours(0,0,0,0);return(this.\u id.getTimestamp()>=today)。请参阅。Robomongo的此功能仍然不稳定。它有50/50的机会发挥作用。此功能似乎已从0.8.5Thx中删除。效果很好!只需在
'db1.source\u collection'
中添加一个结束撇号,而不是在“use admin”之后加上“db.runCommand(…”。您只需执行一个命令,“db.adminCommand(…”这不适用于无法重命名的共享集合。逐个文档复制集合文档需要花费很长时间!公认的答案在2012年可能是最好的方法,但现在通常是更好的解决方案。这里有几个最近的答案提到了这一点,所以如果你从谷歌来这里(像我一样)看一看所有答案!确保阅读其他答案,以确保它符合您的需要,而不仅仅是@kelvin的情况
use sourcedatabase;
var docs=db.sourcetable.find();
use targetdatabase;
docs.forEach(function(doc) { db.targettable.insert(doc); });
db.mycoll.copyTo('my_other_collection');
{ cloneCollection: "<collection>", from: "<hostname>", query: { <query> }, copyIndexes: <true|false> } 
to_app="The name of the app you want to migrate data to"
from_app="The name of the app you want to migrate data from"
collection="the collection you want to copy"
mongohq_url=`heroku config:get --app "$to_app" MONGOHQ_URL`
parts=(`echo $mongohq_url | sed "s_mongodb://heroku:__" | sed "s_[@/]_ _g"`)
to_token=${parts[0]}; to_url=${parts[1]}; to_db=${parts[2]}
mongohq_url=`heroku config:get --app "$from_app" MONGOHQ_URL`
parts=(`echo $mongohq_url | sed "s_mongodb://heroku:__" | sed "s_[@/]_ _g"`)
from_token=${parts[0]}; from_url=${parts[1]}; from_db=${parts[2]}
mongodump -h "$from_url" -u heroku -d "$from_db" -p"$from_token" -c "$collection" -o col_dump
mongorestore -h "$prod_url" -u heroku -d "$to_app" -p"$to_token" --dir col_dump/"$col_dump"/$collection".bson -c "$collection"
db.copyDatabase(fromdb, todb, fromhost, username, password)
db.oldCollection.aggregate([{$out : "newCollection"}])
db.<sourceColl>.find().forEach(function(doc) { 
    db.<newColl>.insert({
        "new_field1":doc.field1,
        "new_field2":doc.field2,
        ....
    })
});`
cursor = db["<collection to copy from>"].find()
for data in cursor:
    db2["<new collection>"].insert(data)
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())
var bulk = db.getSiblingDB(dbName)[targetCollectionName].initializeUnorderedBulkOp();
db.getCollection(sourceCollectionName).find().forEach(function (d) {
    bulk.insert(d);
});
bulk.execute();
mongodump --db=some_database --collection=some_collection --archive=- | mongorestore --nsFrom="some_database.some_collection" --nsTo="some_or_other_database.some_or_other_collection" --archive=-
sh.shardCollection("some_or_other_database.some_or_other_collection", { <shard_key>: 1 });
db.getSiblingDB("config").getCollection("chunks").aggregate([
   { $match: { ns: "some_database.some_collection"} },
   { $sort: { min: 1 } },
   { $skip: 1 }
], { allowDiskUse: true }).forEach(function (chunk) {
   sh.splitAt("some_or_other_database.some_or_other_collection", chunk.min)
})
**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 
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
mongoimport  --host myHost2.com --db myDb2 -u myDbUser2  -p myDbPasword2 --collection myCollection2   --file myfile.csv --type csv --headerline --columnsHaveTypes