我有一个包含大量数据的 mongodb 实例,现在我需要启动一个具有相同结构但没有数据的新实例。
如何完成?
您可以使用“查询”选项执行此操作,查询不返回任何文档。就像是:
mongodump -q '{ "foo" : "bar" }'
这将转储所有数据库和索引,然后您可以执行 mongorestore 将它们重新创建到另一个 mongod 实例中
请参阅文档: http ://docs.mongodb.org/manual/reference/program/mongodump/#cmdoption--query
您可以登录 mongo shell 并执行以下代码语句来生成创建索引语句。之后,使用语句重新创建索引。
var collectionList = db.getCollectionNames();
for(var index in collectionList){
var collection = collectionList[index];
var cur = db.getCollection(collection).getIndexes();
if(cur.length == 1){
continue;
}
for(var index1 in cur){
var next = cur[index1];
if(next["name"] == '_id_'){
continue;
}
var unique=next["unique"]?true:false;
print("try{ db.getCollection(\""+collection+"\").createIndex("+JSON.stringify(next["key"])+",{unique:"+unique+"},{background:1})}catch(e){print(e)}");}}
用于创建索引查询备份的脚本非常简短且出色:
print(`// Backup indexes of : ${db.getName()} : database`);
print(`use ${db.getName()};`);
db.getCollectionNames().forEach(function (collection) {
indexes = db.getCollection(collection).getIndexes().forEach(function (index) {
if (index.name === '_id_') return; // skip defalut _id indexes
const keys = tojsononeline(index.key);
delete index.id; delete index.key; delete index.v; delete index.ns;
print(`db.${collection}.createIndex(${keys}, ${tojsononeline(index)});`);
});
});
您可以像这样直接从 mongo shell 运行它:
mongo --quiet mongodb://localhost:27017/mydatabase indexes-backup.js
输出如下所示:
db.user.createIndex({"user.email":1}, {"name":"userEmail", "background":true});
根据 Ivan 的回答,我改进了脚本,添加了更多选项,例如expireAfterSeconds
(这对我来说很重要)和一个标志变量,以便在创建索引之前删除它们。dropFirst
脚本顶部的变量可以设置为true
在创建之前删除每个索引。此外,此脚本保留索引的现有名称。
var dropFirst = false;
for(var collection of db.getCollectionNames()) {
var indexes = db.getCollection(collection).getIndexes().filter(i => i.name !== '_id_');
if(indexes.length === 0) continue;
print(`\n// Collection: ${collection}`);
for(var index of indexes) {
var key = JSON.stringify(index.key);
var opts = [`name: "${index.name}"`, 'background: true'];
if(index['unique']) opts.push('unique: true');
if(index['hidden']) opts.push('hidden: true');
if(index['sparse']) opts.push('sparse: true');
if(index['expireAfterSeconds'] !== undefined) opts.push(`expireAfterSeconds: ${index['expireAfterSeconds']}`);
if(dropFirst) {
print(`try { db.getCollection("${collection}").dropIndex(${key}); } catch(e) { print('failed to drop ${key}:', e); }`);
}
print(`try { db.getCollection("${collection}").createIndex(${key}, {${opts.join(', ')}}) } catch(e) { print('failed to create ${key}:', e) }`);
}
}