javascript - Mongo Shell 和 .js 脚本通过过滤部分名称并将其与 var 进行比较来重命名集合
问题描述
我正在尝试构建一个要在需要执行以下操作的 mongo shell 中执行的 .js 脚本:
- 获取包含“CollectionUpgrade”字样的所有集合名称的列表
- 将每个集合名称的结尾部分分开(它们被命名为 CollectionUpgrade_20 和 21 和 22 等等直到 29),所以我可以将它与版本模式(比如说 28)进行比较,如果有任何 CollectionUpgrade_30 或 31 来重命名它们作为 CollectionUpgrade_30_old 和 _31_old。
- 列出重命名的集合。
一段时间以来,我一直试图找到一种方法来做到这一点,但我似乎无处可去,并且可以使用 mongoshell/js 大师的智慧!
我找不到输入查询的方法,我看到一些关于提示密码可能性的帖子,用户可以在此处粘贴要添加的确切集合名称:
db.UpgradeCollection_XX.renameCollection("UpgradeCollection_XX_old");
集合的名称可以不同,例如 UsersCollectionUpgrade_22
我只对将结束编号与架构匹配并确保不存在更高的架构感兴趣
我还尝试了一些 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);
推荐阅读
- javascript - 如何在画布上实现波浪动画?使用延迟或其他技术
- node.js - How do I protect a node.js app using the saml2-js package?
- sitecore9 - 根级别的数据无效。第 1 行,sitecore 上的位置 1 升级到 9.2
- javascript - YTDL - 制作文件名视频标题
- java - 如何从 kotlin 访问枚举的“覆盖”name() 方法?
- css - React CSS 导入但未应用
- google-cloud-platform - 评估 run_dag.conf 的值
- javascript - 执行第二次搜索时如何重置 CSS(从第一次搜索中删除搜索结果)
- reactjs - 如何在关闭时重置模态道具
- ajax - 从 HTTP 到损坏的证书 HTTPS 的 IE11 AJAX 请求