MongoDb的shell就是javascript实现的,可以使用js管理数据库。这意味着我们可以使用js脚本进行复杂的管理,例如对数据进行统计计算除了使用mapreduce之外使用js也是很好的选择;这也是MongoDB同其他数据库相比非常大的一个优势。
mongo客户端有两种方式与mongodb服务进行交互。一种是交互式的,另一种是脚本化的(对于脚本化的方式把脚本贴shell执行也是可以的)。 参考 这里 官方说明 对应中文
关于mongo shell的这些方法在官网上都是可以找到手册的。例如 https://docs.mongodb.com/manual/reference/method/ 就可以找到全量的方法。
一、运行脚本的几种方式:
(1)在os命令行下运行一个js文件,如下:
./mongo --host 11.186.6.180 --port 27017 collNumSize.js
注:上述命令不需要进入shell即可执行
(2)在mongo shell交互模式下运行一个js脚本——load方法
load("/usr/local/mongodb4/bin/jsstudy.js")
注:进入mongo shell然后执行上述指令
(3)还有一种mongodb eval的执行脚本的方式。
db.eval("function(){return 'refactor';}")
感觉有点鸡肋,不研究这个东西了
(4)mongo shell中直接贴js脚本
注:作为工具使用的话还是不推荐这种方式了
二、使用体验
1、直接在shell执行js代码
#直接将如下js脚本贴到shell即可执行
注:for循环后面的"{"好像必须要在for语句所在的那一行。
var batchSize = 5;
var eventName = ["report", "meeting", "advantage"]
var docs = [];
for (var i = 0; i < batchSize; i++) {
docs.push( {
event_name : eventName[i % 3], //字符串
type : i % 5, //数值类型
duration : i % 1000 //区分度较大的数值类型
} );
}
#这样我们就把数据写进去了!!!!
mongos> db.collection_2355128746.save(docs)
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 2,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
mongos> db.collection_2355128746.find()
{ "_id" : ObjectId("60195b7a7caf296f546b41b8"), "event_name" : "report", "type" : 0, "duration" : 0 }
{ "_id" : ObjectId("60195b7a7caf296f546b41b9"), "event_name" : "meeting", "type" : 1, "duration" : 1 }
2、执行js脚本文件
1、连接mongdb数据库,并向其中插入记录。
1)创建脚本文件 test.js。如下:
/*
向db_shuozhuo这个数据库的 collection_0/1/2/3/4……集合中依次插入两条记录
注:其中的重点是 集合名称 为变量的情况下如何操作。
*/
var url = "mongodb://127.0.0.1:27017/db_shuozhuo";
var db = connect(url);
var collection_num = 3;
for (var i = 0; i < collection_num; i++)
{
var coll_name = "collection_" + i.toString();
db[coll_name].insert([{
"name": "Sally",
"age": 28,
"gender": "female",
"friend": ObjectId("5c9b18e87c2a03b843f51d1a")
},{
"name": "Jenny",
"age": 29,
"gender": "female",
"friend": ObjectId("5c9b18e87c2a03b843f51d1a")
}]);
}
2)执行此js文件
mongo test.js
然后就可以看到数据库中有对应库名、表名、数据记录了。
其他使用实例
实例一:获取某db的集合名称列表并输出到文档中。
(1)js脚本如下:
var url = "mongodb://127.0.0.1:27017/db_shuozhuo";
var db = connect(url);
var collection_num = 3;
for (var i = 0; i < collection_num; i++)
{
var coll_name = "collection_" + i.toString();
db[coll_name].insert([{
"name": "Sally",
"age": 28,
"gender": "female",
"friend": ObjectId("5c9b18e87c2a03b843f51d1a")
},{
"name": "Jenny",
"age": 29,
"gender": "female",
"friend": ObjectId("5c9b18e87c2a03b843f51d1a")
}]);
}
//getCollectionNames方法可用于获取db中的集合名称
collections=db.getCollectionNames()
//遍历集合列表,挨个输出
for (var i=0; i < collections.length; i++){
print(collections[i])
// print("\n") //换行符,这里不需要再换行
}
(2)按如下方式执行:
(3)file.txt文档如下
实例二、连接远程mongodb并执行js脚本
/*
(1)如果连接语句中没有指定用户名、密码则这个地方必要要指定(即一定要有如下两句)
(2)如果不指定db_name就ok(此时会连到默认的db,如test),指定db_name就不ok(报鉴权出错)此时优先检查这个db的users中是不是有我们用的这个用户名/密码。没有的话个这个db加一个就好了。
*/
var url = "mongodb://mongouser:qq%40mongo@11.186.2.222:27017/db_shuozhuo"
var db = connect(url);
var collection_num = 3;
for (var i = 0; i < collection_num; i++)
{
var coll_name = "collection_" + i.toString();
db[coll_name].insert([{
"name": "Sally",
"age": 28,
"gender": "female",
"friend": ObjectId("5c9b18e87c2a03b843f51d1a")
},{
"name": "Jenny",
"age": 29,
"gender": "female",
"friend": ObjectId("5c9b18e87c2a03b843f51d1a")
}]);
}
//getCollectionNames�~V��~U�~O��~T��~N�~N��~O~Vdb中�~Z~D�~[~F�~P~H�~P~M称
collections=db.getCollectionNames()
//�~A~M�~N~F�~[~F�~P~H�~H~W表,�~L�个�~S�~G�
for (var i=0; i < collections.length; i++){
print(collections[i])
// print("\n") //�~M��~L符,�~Y�~G~L�~M�~\~@�~A�~F~M�~M��~L
}
1、在js脚本中指定用户名、密码、目标db
(1)可选参数的方式:
①./mongo --host 11.186.2.222 --port 27017 collNumSize.js
#当然你非要在链接语句中也带上用户名/密码也是没有问题的
②./mongo --host 11.186.2.222 --port 27017 -u "mongouser" -p "qq@mongo" collNumSize.js
(2)通过uri的方式当然也是可以的,参见 ./mongo -h
③./mongo 11.186.2.222:27017 collNumSize.js
#同理你非要带上用户名、密码也是没问题的
④./mongo mongodb://mongouser:qq%40mongo@11.186.2.222:27017/db_shuozhuo collNumSize.js
2、但是如果js脚本中没有指定用户名、密码,链接的时候就一定要指定,效果如下。
此时只有②④好用了,①③都会报鉴权不通过的错误。如下:
3、注意事项。对于上面指定连接哪个db的时候,要确保用户名、密码确实是这个db的user之一,否则会报鉴权不通过的错误。
举个例子:当我们不指定采用默认db的时候就是ok的,一旦指定我们自己的db就鉴权错误,大概率就是指定的这个db并没有mongouser这个用户。
(1)查看某db有哪些users的方法:
use db_name1
show users;
(2)给这个db添加用户名/密码的方法:
use db_name1
db.createUser({user: "mongouser", pwd: "qq@mongo", roles: [{ role: "dbOwner", db: "db_shuozhuo" }]})
实例三、统计某db下各集合的数据count
//列出每个集合数据的数量
collections=db.getCollectionNames()
for (var i=0; i < collections.length; i++){
var num = db.getCollection(collections[i]).count()
print(collections[i],num)
}
实例四、集合批量创建/删除的脚本
1、集合名称有规律时候的创建
/*
文件名:批量创建集合(prefix+index)
作用:在指定db下