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