首页 > 解决方案 > Mongo Shell 和 .js 脚本通过过滤部分名称并将其与 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"
]

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

标签: javascriptmongodbmongo-shell

解决方案


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

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

推荐阅读