mongodb如何mongodump只索引到另一个mongodb实例

时间:2014-10-20 04:08:33

标签: mongodb mongodump tokumx

我有一个包含大量数据的mongodb实例,现在我需要启动一个没有数据的相同结构的新实例。

如何完成它?

4 个答案:

答案 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) }`);
    }
}