MongoDB是一个流行的文档型数据库,它提供了一个灵活的和强大的查询语言。MongoDB也提供了一个交互式的命令行工具,叫做mongo shell,它可以让你执行JavaScript代码来操作数据库或进行管理操作。本文介绍如何编写mongo shell脚本,以及注意事项和技巧。
什么是mongo shell脚本?
Mongo shell脚本是一种使用JavaScript语言编写的文件,它可以被mongo shell加载和执行。你可以使用mongo shell脚本来实现以下目的:
- 批量处理数据,例如插入、更新、删除或聚合文档。
- 自动化常见的管理任务,例如备份、恢复、监控或优化数据库。
- 测试或调试数据库操作或应用程序逻辑。
- 创建自定义的函数或变量,以便在交互模式下重复使用。
如何执行mongo shell脚本?
要执行一个mongo shell脚本,有以下几种方式:
- 直接通过mongo shell 执行js脚本,例如:
mongo localhost:27017/test myjsfile.js
- 在已经打开的mongoshell中,使用load()方法来加载并执行文件。例如:
load("myscript.js");
编写mongo shell脚本时需要注意什么?
- 要设置全局变量 db,可以使用getDB()方法或connect()方法。你也可以将数据库引用赋值给其他变量。
conn = new Mongo();
db = conn.getDB("myDatabase");
- 在脚本中不能使用任何shell辅助命令(例如`use <dbname>`、`show dbs`等),因为它们不是有效的JavaScript语法。你需要使用对应的JavaScript方法来实现相同的功能。你可以参考MongoDB的官方文档来查看常见shell辅助命令和JavaScript方法之间的对应关系。
- 在交互模式下,mongoshell会自动打印操作结果和游标内容。在脚本中,如果要输出结果到控制台,可以使用JavaScript提供的print()函数或者MongoDB特有的printjson()函数,后者会返回格式化后的JSON数据。
cursor = db.collection.find();
while ( cursor.hasNext() ) {
printjson( cursor.next() );
}
- 在脚本中打开新连接时,请注意连接参数
Example
最近在升级项目中,发现部分字段的类型不兼容,比如老版本是number,新版本却是string.
为了临时解决此类问题和避免人为输错命令,可以通过Javascript脚本将修改字段的语句封装为一个修改类型的方法。
// 封装修改字段的函数
function updateField(fieldName) {
// 计算需要转换类型的文档数量
const countBefore = db.collection.count({[fieldName]: {$exists: true, $not: { $type: "string" } }});
print(`Before update, there are ${countBefore} documents need to be updated for ${fieldName}.`);
// 更新字段类型
const result = db.collection.updateMany(
{[fieldName]: {$exists: true, $not: { $type: "string" } }},
[
{
$set: {
[fieldName]: {
$convert: {
input: { $toString: `${fieldName}` },
to: "string"
}
}
}
}
]
);
// 输出更新结果
print(`Updated ${result.modifiedCount} documents for ${fieldName}.`);
}
// 调用修改字段的函数
updateField("foo");
updateField("bar");
然后就可以使用mongo shell 直接调用此脚本完成修改。