当前位置: 首页 > 知识库问答 >
问题:

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

陶文林
2023-03-14

我知道有一种方法可以实现db。收集getIndexes(),它将列出为集合定义的所有索引。有没有办法将这些索引定义复制并创建到另一个集合?

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

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

共有3个答案

荣轶
2023-03-14

谢谢你的回答,从洛基和布洛克,这帮助了我很多,这里是综合版本的建议,由布洛克。以及在生产中。我们希望确保后台:true用于在复制索引创建时避免从暂停查询。

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);

   }
});
沈伟
2023-03-14

要直接在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}); 

学分:http://aleksandrmaiorov.com/2019/04/29/mongo-how-to-copy-indexes-from-one-database-to-another/

范浩荡
2023-03-14

例如,我有一个现有的用户集合,其中包含索引_id_、name_1、email_1和website_1

然后我有另一个名为usertest的集合,我想将索引从用户集合复制到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);
});

仅复制索引键(批处理)

var indexKeys = db.user.getIndexKeys();
db.usertest.createIndexes(indexKeys);

希望这会有所帮助。这是文档:createIndex

 类似资料:
  • 我有一个问题,但在我看来,我看到的所有解决方案都在解决一个比我更复杂的问题。 我对MongoDB比较陌生,但我一直在将它与Apache Neach一起使用来存储抓取的文档。由于我分阶段抓取,并以不同的方式评估每个抓取的结果,以获取统计数据,因此我一直将结果存储在不同的集合中。 我所要做的就是把这些收藏放在一起成为一个大的收藏,这样我就可以翻译和分类。所有字段都是相同的,因此我不需要添加任何新字段。

  • 有没有一个简单的方法可以做到这一点?

  • 虽然我在stackOverFlow MongoDB上发现了类似的问题,但使用外键将字段复制到另一个集合 我想将字段名称从集合中复制到集合中,其中userdetails中的userId等于user中的\u id。 用户集合 userDetail集合 这是我的问题: 此查询部分工作。它只更新文档,其中_id是字符串类型。_id为ObjectId的用户文档不会更新。

  • 我所处的情况是,当用户付款时,存储在Firestore集合(CartProducts)中的购物车产品应移动到名为SuccessFullOrders的新集合。 因此,我的基本问题是如何在Flutter中将所有文档从一个集合移动到Firestore的另一个集合 我不知道如何在flutter中编写代码。谢谢你的回答 这是我的代码

  • 最初,我认为将一个多索引对象传递给。loc可以提取出我想要的值/级别,但这是行不通的。做这样的事情最好的方法是什么?

  • 问题内容: 我用映射创建了一个新索引。其中存储了500 000个文档。 我想更改索引的映射,但是在elasticsearch中是不可能的。所以我用新的新映射创建了另一个索引,现在我正尝试将文档从旧索引复制到新索引。 我正在使用扫描和滚动类型从旧索引中检索文档并将其复制到新索引。复制需要花费更多时间,并且系统运行缓慢。 下面是我正在使用的代码。 问题答案: 您不必编写类似的代码。周围有一些出色的工具