MongoDB的安装和使用
这里介绍MongoDB的安装和使用方法,包括安装Mongo、使用Shell命令操作MongoDB以及Java API编程实例等。
安装MongoDB
首先,在Linux系统中打开一个终端,执行如下命令导入公共秘钥到包管理器中:
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5
然后,创建MongoDB的文件列表,命令如下:
$ echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb.list
执行如下命令来更新包管理器:
$ sudo apt-get update
最后,执行如下命令安装MongoDB:
$ sudo apt-get install -y mongodb-org
安装完成后,在终端输入以下命令查看MongoDB版本:
$ mongo -version
安装成功以后,启动MongoDB的命令如下:
$ systemctl daemon-reload $ systemctl start mongod
默认设置下,MongoDB是随Ubuntu启动而自动启动的。可以输入以下命令查看是否启动成功:
$ pgrep mongo -l #注意:-l是英文字母l,不是阿拉伯数字1
使用MongoDB结束后,关闭MongoDB的命令如下:
$ sudo service mongodb stop
启动MongoDB命名:
$ sudo service mongodb start
MongoDB练习
1,输入如下命令进入MongoDB Shell模式:
$ mongo
进入MongoDB Shell模式以后,默认连接的数据库是test数据库,可以在命令提示符“>”后面输入各种Shell命令来操作MongoDB数据库。
清空上面的school数据库
use school;
db.dropDatabase();,
2,建立数据库
use school; show tables;
3,创建一年级的3个班,并随机添加 10 名学生
for(grade_index in (grade = [\'grade_1_1\', \'grade_1_2\', \'grade_1_3\'])) { hobbys=[\'draw\', \'dance\', \'running\', \'sing\', \'football\', \'basketball\', \'computer\', \'python\'] for (var i = 1; i <= 10; i++) { db[grade[grade_index]].insert({ "name": "zhangsan" + i, "sex": Math.round(Math.random() * 10) % 2, "age": Math.round(Math.random() * 6) + 3, "hobby": [hobbys[Math.round(Math.random() * 6)]] }); } }
4,查看
查看一年级二班grade_1_2中的所有学生
db.getCollection(\'grade_1_2\').find({})
查看一年级二班grade_1_2中所有年龄是 4 岁的学生
db.getCollection(\'grade_1_2\').find({"age": 4})
查看一年级二班grade_1_2中所有年龄大于 4 岁的学生
db.getCollection(\'grade_1_2\').find({"age": {$gt: 4}})
查看一年级二班grade_1_2中所有年龄大于 4 岁并且小于 7 岁的学生
db.getCollection(\'grade_1_2\').find({"age": {$gt: 4, $lt: 7}})
查看一年级二班grade_1_2中所有年龄大于 4 岁并且性别值为0的学生
db.getCollection(\'grade_1_2\').find({"age": {$gt: 4}, "sex": 0})
查看一年级二班grade_1_2中所有年龄小于 4 岁或者大于 7 岁的学生
db.getCollection(\'grade_1_2\').find({$or: [{"age": {$lt: 4}}, {"age": {$gt: 6}}]})
查看一年级二班grade_1_2中所有年龄是 4 岁或 6 岁的学生
db.getCollection(\'grade_1_2\').find({"age": {$in: [4, 6]}})
查看一年级二班grade_1_2中所有姓名带zhangsan1的学生
db.getCollection(\'grade_1_2\').find({"name": {$regex: "zhangsan1"}})
查看一年级二班grade_1_2中所有姓名带zhangsan1和zhangsan2的学生
db.getCollection(\'grade_1_2\').find({"name": { $in: [new RegExp("zhangsan1"), new RegExp("zhangsan2")] }})
查看一年级二班grade_1_2中所有兴趣爱好有三项的学生
db.getCollection(\'grade_1_2\').find({"hobby": {$size: 3}})
查看一年级二班`grade_1_2`中所有兴趣爱好包括画画的学生
db.getCollection(\'grade_1_2\').find({"hobby": "drawing"})
查看一年级二班`grade_1_2`中所有兴趣爱好既包括画画又包括跳舞的学生
db.getCollection(\'grade_1_2\').find({"hobby": {$all: ["drawing", "dance"]}})
查看一年级二班grade_1_2中所有兴趣爱好有三项的学生的学生数目
db.getCollection(\'grade_1_2\').find({"hobby": {$size: 3}}).count()
查看一年级二班的第二位学生
db.getCollection(\'grade_1_2\').find({}).limit(1).skip(1)
查看一年级二班的学生,按年纪升序
db.getCollection(\'grade_1_2\').find({}).sort({"age": 1})
查看一年级二班的学生,按年纪降序
db.getCollection(\'grade_1_2\').find({}).sort({"age": -1})
5,范围
查看一年级二班的学生,年龄值有哪些
db.getCollection(\'grade_1_2\').distinct(\'age\')
查看一年级二班的学生,兴趣覆盖范围有哪些
db.getCollection(\'grade_1_2\').distinct(\'hobby\')
查看一年级二班的学生,男生(`sex`为 0)年龄值有哪些
db.getCollection(\'grade_1_2\').distinct(\'age\', {"sex": 0})
6,删除
一年级二班grade_1_2, 删除所有 4 岁的学生
db.getCollection(\'grade_1_2\').remove({"age": 4})
一年级二班grade_1_2, 删除第一位 6 岁的学生
db.getCollection(\'grade_1_2\').remove({"age": 6}, {justOne: 1})
7,修改
一年级二班grade_1_2中,修改名为zhangsan7的学生,年龄为 8 岁,兴趣爱好为 跳舞和画画;
db.getCollection(\'grade_1_2\').update({"name": "zhangsan7"}, {$set: {"age": 8, "hobby": ["dance", "drawing"]}})
一年级二班`grade_1_2`中,追加zhangsan7`学生兴趣爱好唱歌;
db.getCollection(\'grade_1_2\').update({"name": "zhangsan7"}, {$push: {"hobby": "sing"}})
一年级二班`grade_1_2`中,追加zhangsan7`学生兴趣爱好吹牛和打篮球;
db.getCollection(\'grade_1_2\').update({"name": "zhangsan7"}, {$push: {"hobby": {$each: ["brag", "play_basketball"]}}})
一年级二班`grade_1_2`中,追加`zhangsan7`学生兴趣爱好唱歌和打篮球,要保证`hobby`数组不重复;
db.getCollection(\'grade_1_2\').update({"name": "zhangsan7"}, {$addToSet: {"hobby": {$each: ["sing1", "play_basketball"]}}})
新学年,给一年级二班所有学生的年龄都增加一岁
db.getCollection(\'grade_1_2\').update({}, {$inc: {"age": 1}}, {multi: true})
一年级二班grade_1_2中,删除zhangsan7学生的sex属性
db.getCollection(\'grade_1_2\').update({"name": "zhangsan7"}, {$unset: {"sex": 1}})
一年级二班grade_1_2中,删除zhangsan7学生的hobby数组中的头元素
db.getCollection(\'grade_1_2\').update({"name": "zhangsan7"}, {$pop: {"hobby": -1}})
一年级二班`grade_1_2`中,删除`zhangsan7`学生的`hobby`数组中的尾元素
db.getCollection(\'grade_1_2\').update({"name": "zhangsan7"}, {$pop: {"hobby": 1}})
一年级二班`grade_1_2`中,删除`zhangsan7`学生的`hobby`数组中的`sing`元素
db.getCollection(\'grade_1_2\').update({"name": "zhangsan7"}, {$pull: {"hobby": "sing"}})
8,分组
新建一个集合grade_1_4,记录一年级四班在期中考试时的成绩;
for (var i = 1; i <= 10; i++) { db.grade_1_4.insert({ "name": "zhangsan" + i, "sex": Math.round(Math.random() * 10) % 2, "age": Math.round(Math.random() * 6) + 3, "score": { "chinese": 60 + Math.round(Math.random() * 40), "math": 60 + Math.round(Math.random() * 40), "english": 60 + Math.round(Math.random() * 40) } }); }
统计每名学生在考试中的总分
db.grade_1_4.group({ key: {"name": 1}, cond: {}, reduce: function(curr, result) { result.total += curr.score.chinese + curr.score.math + curr.score.english; }, initial: { total : 0 } })
统计每名男生在考试中的总分
db.grade_1_4.group({ key: {"name": 1}, cond: {"sex": 0}, reduce: function(curr, result) { result.total += curr.score.chinese + curr.score.math + curr.score.english; }, initial: { total : 0 } })
统计每名男生在考试中的总分及平均分
db.grade_1_4.group({ key: {"name": 1}, cond: {"sex": 0}, reduce: function(curr, result) { result.total += curr.score.chinese + curr.score.math + curr.score.english; }, initial: { total : 0 }, finalize: function(item) { item.avg = (item.total / 3).toFixed(2); return item; } })
9,聚合
根据姓名分组, 并统计人数
db.getCollection(\'grade_1_4\').aggregate([
{$group: {_id: "$name", num: {$sum: 1}}}
])
根据姓名分组, 并统计人数,过滤人数大于 1 的学生
db.getCollection(\'grade_1_4\').aggregate([ {$group: {_id: "$name", num: {$sum: 1}}}, {$match: {num: {$gt: 1}}} ])
统计每名学生在考试中的总分
db.getCollection(\'grade_1_4\').aggregate([ {$group: {_id: "$name", score: {$sum: {$sum: ["$score.chinese", "$score.math", "$score.english"]}}}} ])
统计每名男生在考试中的总分
db.getCollection(\'grade_1_4\').aggregate([ {$match: {sex: 0}}, {$group: {_id: "$name", score: {$sum: {$sum: ["$score.chinese", "$score.math", "$score.english"]}}}} ])
统计每名男生在考试中的总分, 总分降序
db.getCollection(\'grade_1_4\').aggregate([
{$match: {sex: 0}},
{$group: {_id: "$name", score: {$sum: {$sum: ["$score.chinese", "$score.math", "$score.english"]}}}},
{$sort: {score: 1}}
])