我有一个包含大量数据的mongodb实例,现在我需要启动一个没有数据的相同结构的新实例。
如何完成它?
答案 0 :(得分:11)
您可以使用"查询"选项,查询不返回任何文档。类似的东西:
mongodump -q '{ "foo" : "bar" }'
这将转储所有dbs和索引,然后你可以做一个mongorestore来重新创建它们到另一个mongod实例
参见文档: http://docs.mongodb.org/manual/reference/program/mongodump/#cmdoption--query
答案 1 :(得分:4)
用于创建索引查询备份的脚本非常简短:
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});
答案 2 :(得分:2)
您可以登录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)}");}}
答案 3 :(得分:0)
根据 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) }`);
}
}