我有一个名为test
的mongo db,其中包含两个集合collection1
和collection1_backup
。
如何用collection1_backup
中的数据替换collection1
的内容。
我有一个名为test
的mongo db,其中包含两个集合collection1
和collection1_backup
。
如何用collection1_backup
中的数据替换collection1
的内容。
考虑到集合名称以_backup
结尾,最好的方法可能是使用mongorestore:http://docs.mongodb.org/manual/reference/mongorestore/
不过,在这种情况下,具体情况而定。如果集合未被分片,您可以使用renameCollection
(http://docs.mongodb.org/manual/reference/command/renameCollection/),或者使用更多手动的方法(在JavaScript代码中):
db.collection1.drop(); // Drop entire other collection
db.collection1_backup.find().forEach(function(doc){
db.collection1.insert(doc); // start to replace
});
这些是最常用的方法。
db.collection1_backup.aggregate([ { $match: {} }, { $out: "collection1" } ])
collection1
的文档,然后在collection1中创建collection1_backup
的克隆。db.<SOURCE_COLLECTION>.aggregate([ { $match: {} }, { $out: "<TARGET_COLLECTION>" } ])
TARGET_COLLECTION
不存在,上述命令将会创建它。另外还有一个非常实用的功能: 将集合导出为JSON文件
mongoexport --collection collection1_backup --out collection1.json
从JSON文件导入集合
mongoimport --db test --collection collection1 --file collection1.json
要从备份/转储文件中导入单个集合,需要将*.bson文件转换为*.json文件,方法是使用
bsondump collection1_backup.bson > collection1_backup.json
mongodump
和mongorestore
,因为将文档转换为JSON然后再转回来可能会影响数据类型的保真度。在BSON中存在一些数据类型,在JSON中可能有不同的表示方式,其中没有严格的JSON等效项。使用mongoimport
/mongoexport
取决于您的数据,但这是一个重要的注意事项。 - Stenniemongorestore --noIndexRestore
跳过重新创建索引(除了必需的 _id
索引)。请注意,mongorestore
(截至 MongoDB 3.4)仅执行插入操作;如果具有相同 _id
的文档已存在,则不会更新或替换它。mongoimport
工具支持 upserts(在 3.4 中支持合并),但仅适用于文本格式,而不是 MongoDB 的原生 BSON 格式。如果您想在 MongoDB 部署之间完全重建数据(以及可选的集合元数据),则仍然建议使用 mongodump
和 mongorestore
。 - Stenniedb.collection1.drop();
//将collection1_backup中的数据复制到collection1中
db.collection1.insert(db.collection1_backup.find({},{_id:0}).toArray());
db.sourceCollectionName.copyTo('targetCollectionName')
您的 targetCollectionName 必须使用单引号或双引号
注意:
db.collection.copyTo() 方法在内部使用 eval 命令。因此,db.collection.copyTo() 操作会获取全局锁,阻塞所有其他读写操作,直到 db.collection.copyTo() 完成。
public void copyTo(String db,String sourceCollection,String destinationCollection,int limit) throws
UnknownHostException {
MongoClient mongo = new MongoClient("localhost", 27017);
DB database = mongo.getDB(db);
DBCollection collection = database.getCollection(sourceCollection);
DBCursor dbCursor = collection.find().limit(limit);
List<DBObject> list = dbCursor.toArray();
DBCollection destination = database.getCollection(destinationCollection);
destination.insert(list, WriteConcern.NORMAL); //WRITE CONCERN is based on your requirment.
}
import com.mongodb.client.MongoCollection;
,我添加了以下代码段:MongoCollection database = template.getCollection("database");
List documents = new ArrayList<>();
database.find().iterator().forEachRemaining(documents::add);
MongoCollection destination = template.getCollection("destination");
destination.insertMany(documents);
database.drop();
- Kyofa.toArray()
。 db.collection1.drop(); // Drop entire other collection
// creates an array which can be accessed from "data"
db.collection1_backup.find().toArray(function(err, data) {
// creates a collection and inserting the array at once
db.collection1.insert(data);
});
删除集合1
然后使用以下查询
var cursor = db.collection1_backup.find();
var data = [];
while(cursor.hasNest()){
data.push(cursor.next());
}
db.collection1.insertMany(data)
只需运行这个简单的查询...
db.collection1.insertMany(db.collection1_backup.find({}).toArray())
wiredTiger.configString='block_compressor=zstd'
。 聚合几乎立即由percona-server-mongodb-server-4.2.6-6.el7.x86_64
执行。 - Denis Denisovdb.collection1_backup.aggregate([ { $match: {} }, { $out: "collection1" } ])
的速度比find().forEach(..insert
=~100rec/s` 更快。参考链接:https://forums.meteor.com/t/iterating-over-mongo-cursor-too-slow-server-side/19531/13 https://mongobooster.useresponse.com/topic/slow-performance-using-foreach https://dev59.com/EI3da4cB1Zd3GeqPvBu8 - Denis Denisov