4.Mongodb之js脚本

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下
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

焱齿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值