Mongo Shell 和 .js 脚本通过过滤部分名称并将其与 var 进行比较来重命名集合

Mongo Shell and .js script to rename collection by filtering part of name and comparing it to a var

我正在尝试构建要在 mongo shell 中执行的 .js 脚本,需要执行以下操作:

一段时间以来,我一直在尝试寻找一种方法,但似乎无济于事,我可以利用 mongoshell/js 大师的智慧!

我也尝试了一些 if 语句并结合了一段时间,但我没有成功。

另一种尝试是要求用户将集合的确切名称输入 cmd 输入并将其转换为我在上述命令中复制的 var 然后 > fix.js 和 运行 这与 mongo shell 但这并没有完全符合我的预期 - 正在进行中。

数据库中的集合名称示例:

Schema version:28
[
        "appInfosCollectionUpgrade_18",
        "appInfosCollectionUpgrade_20",
        "appInfosCollectionUpgrade_21",
        "appInfosCollectionUpgrade_27",
        "appInfosCollectionUpgrade_28",
        "collectionsCollectionUpgrade_22",
        "collectionsCollectionUpgrade_23",
        "collectionsCollectionUpgrade_27",
        "collectionsCollectionUpgrade_30",
        "configurationsCollectionUpgrade_10",
        "configurationsCollectionUpgrade_11",
        "configurationsCollectionUpgrade_12",
        "configurationsCollectionUpgrade_17",
        "configurationsCollectionUpgrade_20",
        "configurationsCollectionUpgrade_21",
        "configurationsCollectionUpgrade_26",
        "configurationsCollectionUpgrade_27",
        "configurationsCollectionUpgrade_6",
        "configurationsCollectionUpgrade_7",
        "configurationsCollectionUpgrade_8",
        "configurationsCollectionUpgrade_9",
        "districtsCollectionUpgrade_27",
        "subscriptionsCollectionUpgrade_19",
        "subscriptionsCollectionUpgrade_20",
        "subscriptionsCollectionUpgrade_21",
        "subscriptionsCollectionUpgrade_25",
        "subscriptionsCollectionUpgrade_27",
        "userCollectionUpgrade_30",
        "usersCollectionUpgrade_19",
        "usersCollectionUpgrade_20",
        "usersCollectionUpgrade_24",
        "usersCollectionUpgrade_25",
        "usersCollectionUpgrade_27",
        "usersCollectionUpgrade_31"
]

任何提示想法或帮助都会对这个苦苦挣扎的人有很大帮助!

您可以根据您的大纲编写管理脚本如下:

var newVersion = passwordPrompt();
var collectionsWithWordOnly = name => name.startsWith('CollectionUpgrade');
var olderVersionsOnly = name => {
  var [_, version, old] = name.split('_');
  if (old) {
    return false;
  }
  if (+version <= +newVersion) {
    return false;
  }
  return true;
};
var renameAsOldVersion = (name) => {
  var newName = `${name}_old`;
  db[name].renameCollection(newName);
};
db.getCollectionNames()
  .filter(collectionsWithWordOnly)
  .filter(olderVersionsOnly)
  .forEach(renameAsOldVersion);