MongoDB如何将索引定义从一个集合复制到另一个集合?

MongoDB如何将索引定义从一个集合复制到另一个集合?,mongodb,Mongodb,我知道有一种方法可以执行db.collection.getIndexes(),它将列出为集合定义的所有索引。是否有方法将这些索引定义复制并创建到另一个集合 有很多,我不想一个接一个地做 关于重复的问题注释:我不希望复制收藏。我希望以可以应用于另一个集合的格式导出索引。例如,我有一个现有的用户集合,其索引为\u id\u、名称\u 1、电子邮件\u 1和网站\u 1 然后我有另一个名为usertest的集合,我想将索引从user集合复制到usertest集合。以下命令适用于此场景: 复制索引键和索

我知道有一种方法可以执行db.collection.getIndexes(),它将列出为集合定义的所有索引。是否有方法将这些索引定义复制并创建到另一个集合

有很多,我不想一个接一个地做


关于重复的问题注释:我不希望复制收藏。我希望以可以应用于另一个集合的格式导出索引。

例如,我有一个现有的用户集合,其索引为\u id\u、名称\u 1、电子邮件\u 1和网站\u 1

然后我有另一个名为usertest的集合,我想将索引从user集合复制到usertest集合。以下命令适用于此场景:

  • 复制索引键和索引选项

    var indexes = db.user.getIndexes();
    
    indexes.forEach(function(index){
        delete index.v;
        delete index.ns;
        var key = index.key;
        delete index.key
        var options = [];
        for (var option in index) {
            options.push(index[option]);
        }
       db.usertest.createIndex(key, options);
    });
    
  • 仅复制索引键(批处理)


  • 希望这会有帮助。这是医生:

    谢谢洛奇和布洛克的回答,这对我帮助很大 这是Bloke建议的合并版本。 和在生产中。我们希望确保背景:真实 用于在复制索引创建时避免从属暂停查询

    var indexes = db.user.getIndexes();
    // we skipped the __id__ indexes and set the default background: true option
    indexes.forEach(function(index){
        if(index.name =='_id_'){
         print("we are skip the _id_ index")
        }else{
        delete index.v;
        delete index.ns;
        var key = index.key;
        delete index.key
        var options = {};
        for (var option in index) {
            options[option] = index[option]
        }
        options['background'] = true;
        printjson(key);
        printjson(options);
        db.usertest.createIndex(key, options);
    
       }
    });
    

    Rocky Li的回答很有帮助,但在撰写本文时没有正确创建索引选项(它收集了选项值,但没有收集键)。以下修改对我有效:

    var indexes = db.user.getIndexes();
    
    indexes.forEach(function(index){
        delete index.v;
        delete index.ns;
        var key = index.key;
        delete index.key
    
        // uncomment if you want to ensure creation is in background
        //if(!('background' in index))
            //index['background'] = true;
    
       db.user.createIndex(key, index);
    });
    

    将所有索引从一个数据库复制到另一个数据库

     use firstDbName;
     var indexKeyArray = [];
     db.getCollectionNames().forEach(function(collection) {
     var indexKeys = db[collection].getIndexKeys();
     var base = {};
     base["name"] = collection;
     base["indices"] = indexKeys
     indexKeyArray.push(base);
    });
    #printjson(indexKeyArray);
    use destinationDbName;
    indexKeyArray.forEach(function(data) {
      db[data.name].createIndexes(data.indices);
    });
    

    要直接在MongoDB中执行此操作,请执行以下操作:

    以下命令将为所有集合的现有索引生成mongo DB查询

    db.getCollectionNames().forEach(function(col) {
        var indexes = db[col].getIndexes();
        indexes.forEach(function (c) {
            var fields = '', result = '', options = {};
            for (var i in c) {
                if (i == 'key') {
                    fields = c[i];
                } else if (i == 'name' && c[i] == '_id_') {
                    return;
                } else if (i != 'name' && i != 'v' && i != 'ns') {
                    options[i] = c[i];
                }
            }
            var fields = JSON.stringify(fields);
            var options = JSON.stringify(options);
            if (options == '{}') {
                result = "db." + col + ".createIndex(" + fields + "); ";
            } else {
                result = "db." + col + ".createIndex(" + fields + ", " + options + "); ";
            }
            result = result
                .replace(/{"floatApprox":-1,"top":-1,"bottom":-1}/ig, '-1')
                .replace(/{"floatApprox":(-?\d+)}/ig, '$1')
                .replace(/\{"\$numberLong":"(-?\d+)"\}/ig, '$1');
            print(result);
        });
    });
    
    上面的命令将根据收集量输出如下内容

    db.User.createIndex({"createdAt":-1}, {"background":true}); 
    
    db.User.createIndex({"updatedAt":-1}, {"background":true}); 
    
    db.Login.createIndex({"loginDate":-1}, {"background":true}); 
    
    因此,执行此操作后,将上面生成的MongoDB查询复制到新集合以创建索引,在其中更改集合名称,然后执行它

    例如:要将属于用户集合的所有索引复制到UserNew集合,我将把查询的旧集合名称重命名为new,如下所示并执行它,也就是说,现在您已经将所有索引从旧集合复制到新集合

    db.UserNew.createIndex({"createdAt":-1}, {"background":true}); 
    
    db.UserNew.createIndex({"updatedAt":-1}, {"background":true}); 
    

    信用证:

    可能重复获取有效JSON中的索引,然后复制粘贴:
    JSON.stringify(db.clients.getIndexes())
    我看到了db.collection.getIndexKeys()方法。我马上看到的问题是,它没有列出索引的选项,对吗?因此,用户集合上的唯一索引在usertest集合上不是唯一的:/n您知道有任何参数要传递给getIndexKeys()方法,以便它返回索引选项吗?我在文档上找不到方法。据我所知,没有这样的参数。我已更新代码以复制索引选项。希望对您有所帮助。
    options.push中的
    'option'
    (索引['option'])应该没有引号,对吗?我们想要的是变量,而不是字符串“option”?但是,这可能会抛出数组形式提供的索引选项,这些选项可能只指定三个值:name、unique、dropDups“
    ,因此最好将
    选项作为对象发送,因此第7行:
    var options={}
    然后第10行:
    options[option]=Index[option]
    db.UserNew.createIndex({"createdAt":-1}, {"background":true}); 
    
    db.UserNew.createIndex({"updatedAt":-1}, {"background":true});