14

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

如何完成?

4

4 回答 4

14

您可以使用“查询”选项执行此操作,查询不返回任何文档。就像是:

mongodump -q '{ "foo" : "bar"  }'

这将转储所有数据库和索引,然后您可以执行 mongorestore 将它们重新创建到另一个 mongod 实例中

请参阅文档: http ://docs.mongodb.org/manual/reference/program/mongodump/#cmdoption--query

于 2014-10-20T06:00:43.243 回答
8

您可以登录 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)}");}}
于 2019-08-31T09:57:13.937 回答
5

用于创建索引查询备份的脚本非常简短且出色:

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});
于 2020-04-22T09:35:20.220 回答
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) }`);
    }
}

于 2021-02-05T11:56:25.030 回答