12-1 初识 MongoDB第1关启动 MongoDB编程要求根据提示在右侧命令行Linux 环境进行操作在 /data 路径下创建文件夹 mydb 来存放 MongoDB 服务的数据在 /logs 路径下创建文件夹 mymongo 存放日志文件 mongod.log 在 /etc/mymongod 路径下新建配置文件 mongod.conf使用配置文件启动 MongoDB连接端口号设置为 27020使用命令通过配置文件启动服务。cd /data mkdir db_test mkdir /logs cd /logs mkdir mongo mkdir /etc/mongod cd /etc/mongod vim mongod.conf ## 跳转到vim编辑器 【按 “i” 键】 ## 输入配置文件内容 port27020 dbpath/data/db_test logpath/logs/mongo/mongod.log logappendtrue forktrue 【按 “ESC” 键】 【输入 “:wq”】 【回车】 ## 退出vim编辑器 mongod -f /etc/mongod/mongod.conf mongo --port 27020第2关启动 MongoDB 多实例编程要求根据提示在右侧命令行Linux 环境进行操作在 /data 路径下创建文件夹 mydb1 和 mydb2 来存放两组 MongoDB 服务的数据在 /logs 路径下创建文件夹 mymongo1 和 mymongo2 存放日志文件在 /etc/mymongod 路径下新建配置文件 mongod1.conf 和 mongod2.conf使用配置文件启动 MongoDB连接端口号分别设置为 27021和27022使用命令通过配置文件启动两组服务。cd /data mkdir mydb1 mydb2 mkdir /logs cd /logs mkdir mymongo1 mymongo2 mkdir /etc/mymongod cd /etc/mymongod vim mongod1.conf ## 跳转到vim编辑器 【按 “i” 键】 ## 输入配置文件内容 port27021 dbpath/data/mydb1 logpath/logs/mymongo1/mongod.log logappendtrue forktrue 【按 “ESC” 键】 【输入 “:wq”】 【回车】 ## 退出vim编辑器 vim mongod2.conf ## 跳转到vim编辑器 【按 “i” 键】 ## 输入配置文件内容 port27022 dbpath/data/mydb2 logpath/logs/mymongo2/mongod.log logappendtrue forktrue 【按 “ESC” 键】 【输入 “:wq”】 【回车】 ## 退出vim编辑器 mongod -f /etc/mymongod/mongod1.conf mongod -f /etc/mymongod/mongod2.conf mongo --port 27021 exit mongo --port 27022第3关退出客户端和关闭 MongoDB 服务编程要求根据提示在右侧命令行Linux 环境进行操作关闭端口为 27017默认端口的 MongoDB 服务.ps -ef | grep mongo这里输入ps -ef | grep mongo后显示的进程以及编号可能不一样除了最后这个全部使用kill命令关闭MongoDB 文档的高级查询操作第1关数据的导入导出一、任务描述本关任务向数据库导入数据和从数据库导出数据。rootevassh-12318384:~# mongoimport -d mydb1 -c test --type csv --headerline --ignoreBlanks --file /home/example/student.csv rootevassh-12318384:~# mongoexport -d mydb1 -c test -o /home/test1.json --type json rootevassh-12318384:~# mongoexport -d mydb1 -c test -o /home/test1.csv --type csv -f _id,name,age,sex,major第2关高级查询一一、任务描述本关任务根据编程要求完成文档查询。二、相关知识为了完成本关任务你需要掌握各种查询操作符的用法。命令行mongoimport -d mydb2 -c test --type json --file /home/example/person.json代码文件echo “db.test.find({hobbies:{\$all:[‘唱歌’,’跳舞’]}}).sort({_id:1}); db.test.find({hobbies:{\$all:[‘羽毛球’,’跳舞’]}}).sort({_id:1}); db.test.find({hobbies:{\$size:3}}).sort({_id:1}); db.test.find({hobbies:{\$exists:true}}).sort({_id:1}); db.test.find({age:{\$in:[19,23]}}).sort({_id:1}); db.test.find({age:{\$nin:[20]}}).sort({_id:1}); db.test.find({age:{\$mod:[9,2]}}).sort({_id:1});”第3关高级查询二一、本关任务根据编程要求完成文档查询。二、相关知识为了完成本关任务你需要掌握各种查询操作符的用法。代码行echo db.test.find({\$and:[{age:20},{sex:男}]}).sort({_id:1}); db.test.find({\$or:[{sex:男},{age:20}]}).sort({_id:1}); db.test.find({name:/^韩.*/}).sort({_id:1}); db.test.find({\$and:[{age:{\$gte:19}},{age:{\$lt:22}}]}).sort({_id:1}); db.test.find({\$or:[{age:{\$lt:19}},{age:{\$gt:21}}]}).sort({_id:1}); db.test.find({name:{\$not:/^韩.*/}}).sort({_id:1}); db.test.find({name:{\$not:/^韩.*/}}).count(); db.test.find({\$and:[{age:{\$gte:19}},{age:{\$lt:22}}]}).count(); 命令行mongoimport -d mydb3 -c test --type json --file /home/example/person.json第4关游标一、本关任务按照编程要求在命令行进操作使用游标插入文档。二、相关知识mongo use mydb4 for(var i0;i10000;i)db.test.insert({_id:i,title:MongoDBi,content:helloi}); exit mongoexport -d mydb4 -c test -f _id.title,content -o /home/test/test4.csv --type csvMongoDB实验——数据库基本操作第1关创建数据库任务描述本关任务创建数据库。编程要求在右侧命令行中连接MongoDB创建一个名为mydb的数据库并插入数据_id:1,name:李小红。#连接数据库 mongo use mydb db.mydb.insert({_id:1,name:李小红})第2关创建集合编程要求在右侧命令行中操作创建数据库Testdb2创建集合t_stu内容如下#进入MongoDB mongo use Testdb2 db.t_stu.insert([{_id : 1,name : 小明,sex : 男,hobbies : [乒乓球,羽毛球]},{_id : 2,name : 小红,sex : 女,hobbies : [ 画画,唱歌]}]) BulkWriteResult({ writeErrors : [ { index : 0, code : 11000, errmsg : E11000 duplicate key error collection: Testdb2.t_stu index: _id_ dup key: { : 1.0 }, op : { _id : 1, name : 小明, sex : 男, hobbies : [ 乒乓球, 羽毛球 ] } } ], writeConcernErrors : [ ], nInserted : 0, nUpserted : 0, nMatched : 0, nModified : 0, nRemoved : 0, upserted : [ ] }) db.t_stu.find()第3关文档操作一任务描述本关任务文档数据在MongoDB中的插入和更新。编程要求现在有文档数据如下mongo use Testdb3 document({_id : 1,name : 张小华,sex : 男,phone : 12356986594,hobbies : [ 打篮球,踢足球,唱歌 ]}) { _id : 1, name : 张小华, sex : 男, phone : 12356986594, hobbies : [ 打篮球, 踢足球, 唱歌 ] } db.stu1.insert(document) db.stu2.insert(document) db.stu3.insert(document) db.stu2.update({phone : 12356986594},{$set:{phone : 18356971462}}) db.stu3.save({_id : 1,name : 张晓晓,sex : 女,phone : 12365498704,hobbies : [ 跳舞,羽毛球,唱歌 ]})第4关文档操作二任务描述本关任务文档数据在MongoDB中的查询和删除。#########begin######### echo document([ {_id:1,name:西西,sex:女,age:23,national:汉族}, {_id:2,name:东东,sex:男,age:20,national:苗族}, {_id:3,name:北北,sex:男,age:19,national:汉族}, {_id:4,name:南南,sex:女,age:15,national:傣族}]); db.stu1.insert(document); db.stu2.insert(document); db.stu1.find({age:{\$gte:15},sex:女}); db.stu1.find({national:苗族}); db.stu1.find({age:{\$lt:20},sex:男}); db.stu2.remove({}); #########end#########第5关综合实训——学生信息管理任务描述本关任务按照编程要求在命令行进行操作完成对数据库中学生信息的管理操作。#########begin######### echo document([ {_id:1,name:西西,sex:女,age:23,national:汉族}, {_id:2,name:东东,sex:男,age:20,national:苗族}, {_id:3,name:北北,sex:男,age:19,national:汉族}, {_id:4,name:南南,sex:女,age:15,national:傣族}]); db.stu1.insert(document); db.stu2.insert(document); db.stu1.find({age:{\$gte:15},sex:女}); db.stu1.find({national:苗族}); db.stu1.find({age:{\$lt:20},sex:男}); db.stu2.remove({}); #########end#########MongoDB 之聚合函数查询统计第1关聚合管道操作符将文档定制格式输出一编程要求为了减少你的工作量给出以下文档内容#********* Begin *********# echo db.educoder.aggregate({\$project:{_id:0, course:1, learning_num:1}}); db.educoder.aggregate({\$match:{learning_num:1882}}); #********* End *********#mongo use test1 db.educoder.insert([{ _id:1, course:Python表达式问题求解实训, author:李暾, tags:[Python基础,求解], learning_num:1882 }, { _id:2, course:Java语言之基本语法, author:余跃, tags:[Java基础,语法], learning_num:814 }, { _id:3, course:Python面向对象编程实训, author:李暾, tags:[Python基础,面向对象], learning_num:143 }, { _id:4, course:Android综合实训之物联网移动应用开发1, author:prophet5, tags:[Android,物联网,移动开发], learning_num:207 } ])第2关聚合管道操作符将文档定制格式输出二编程要求为了减少你的工作量给出以下文档内容mongo use test2 db.educoder.insert([{ _id:1, course:Python表达式问题求解实训, author:李暾, tags:[Python基础,求解], learning_num:1882 }, { _id:2, course:Java语言之基本语法, author:余跃, tags:[Java基础,语法], learning_num:814 }, { _id:3, course:Python面向对象编程实训, author:李暾, tags:[Python基础,面向对象], learning_num:143 }, { _id:4, course:Android综合实训之物联网移动应用开发1, author:prophet5, tags:[Android,物联网,移动开发], learning_num:207 } ])#********* Begin *********# echo db.educoder.aggregate({\$limit:3}); db.educoder.aggregate({\$sort:{learning_num:1}}); db.educoder.aggregate({\$skip:2}); #********* End *********#第3关聚合表达式对文档数据进行统计#********* Begin *********# echo db.educoder.aggregate([{\$skip:0},{\$limit:3}]); db.educoder.aggregate({\$sort:{learning_num:1}}); db.educoder.aggregate([{\$skip:2},{\$limit:2}]); #********* End *********#mongo use test3 db.educoder.insert([{ _id:1, course:Python表达式问题求解实训, author:李暾, tags:[Python基础,求解], learning_num:1882 }, { _id:2, course:Java语言之基本语法, author:余跃, tags:[Java基础,语法], learning_num:814 }, { _id:3, course:Python面向对象编程实训, author:李暾, tags:[Python基础,面向对象], learning_num:143 }, { _id:4, course:Android综合实训之物联网移动应用开发1, author:prophet5, tags:[Android,物联网,移动开发], learning_num:207 } ])MongoDB 之滴滴、摩拜都在用的索引第1关了解并创建一个简单索引mongo use test db.student.insert([ { _id:1, name:王小明, age:15, score:90 }, { _id:2, name:周晓晓, age:18, score:86 }, { _id:3, name:王敏, age:20, score:96 }, { _id:4, name:李晓亮, age:15, score:74 }, { _id:5, name:张青青, age:21, score:88 }]) db.student.createIndex({score:-1})第2关常见索引的创建mongo use test2 db.article.insert([ { _id:1, title:提升程序员工作效率的6个工具利器, tags:[Alfred,幕布], follwers:543 }, { _id:2, title:我是如何从零开始学习前端的, tags:[HTML,Html5,CSS], follwers:1570 }, { _id:3, title:20个非常有用的JAVA程序片段, tags:[Java,编程], follwers:1920 }]) db.article.createIndex({follwers:1, title:1}) db.article.createIndex({tags:-1}) db.article.createIndex({_id:hashed}) db.article.createIndex({title:text, tags:text})第3关有趣的地理位置索引echo db.people.insert({_id:1,name:A,personloc:{type:Point,coordinates:[116.403981,39.914935]}}); db.people.insert({_id:2,name:B,personloc:{type:Point,coordinates:[116.433733,39.909511]}}); db.people.insert({_id:3,name:C,personloc:{type:Point,coordinates:[116.488781,39.949901]}}); db.people.insert({_id:4,name:D,personloc:{type:Point,coordinates:[116.342609,39.948021]}}); db.people.insert({_id:5,name:E,personloc:{type:Point,coordinates:[116.328236,39.901098]}}); db.people.insert({_id:6,name:F,personloc:{type:Point,coordinates:[116.385728,39.871645]}}); db.people.createIndex({personloc:2dsphere}); db.runCommand({geoNear:people,near:{type:Point,coordinates:[116.403981,39.914935]},spherical:true,minDistance:100,maxDistance:3000}); db.runCommand({geoNear:people,near:{type:Point,coordinates:[116.433733,39.909511]},spherical:true,minDistance:100,maxDistance:5000}); db.runCommand({geoNear:people,near:{type:Point,coordinates:[116.488781,39.949901]},spherical:true,minDistance:3000,maxDistance:8000}); db.runCommand({geoNear:people,near:{type:Point,coordinates:[116.342609,39.948021]},spherical:true,minDistance:3000,maxDistance:8000}); MongoDB 复制集 分片第1关MongoDB 架构第2关MongoDB 复制集搭建mkdir /data /test mkdir /data/test /db1 mkdir /data/test/db2 mkdir /data/test/db3 mkdir /logs mkdir /logs/test cd /etc mkdir /etc/test cd /etc/test vim mongod1.conf 进入文件内按i然后输入下文 port20001 dbpath/data/test/db1 logpath/logs/test/mongod1.log logappendtrue fork true replSetYOURMONGO 按esc然后输入 :wq ,回车 vim mongod2.conf 进入文件内按i然后输入下文 port20002 dbpath/data/test/db2 logpath/logs/test/mongod2.log logappendtrue forktrue replSetYOURMONGO 按esc然后输入 :wq ,回车 vim mongod3.conf 进入文件内按i然后输入下文 port20003 dbpath/data/test/db3 logpath/logs/test/mongod3.log logappendtrue forktrue replSetYOURMONGO 按esc然后输入 :wq ,回车 mongod -f /etc/test/mongod1.conf mongod -f /etc/test/mongod2.conf mongod -f /etc/test/mongod3.conf mongo --port 20001 use admin config {_id:YOURMONGO, members:[{_id:0,host:127.0.0.1:20001},{_id:1,host:127.0.0.1:20002,arbiterOnly:true},{_id:2,host:127.0.0.1:20003}]} rs.initiate(config) rs.status() use test db.person.insert ({_id:1,name:王小明,age:20})第3关MongoDB 分片集搭建mkdir -p /data/test2/shard1/db mkdir -p /logs/test2/shard1/log mkdir -p /data/test2/shard2/db mkdir -p /logs/test2/shard2/log mkdir -p /data/test2/shard3/db mkdir -p /logs/test2/shard3/log mkdir -p /data/test2/config/db mkdir -p /logs/test2/config/log mkdir -p /logs/test2/mongs/log mkdir -p /etc/test2 cd /etc/test2 vim mongod1.conf 进入文件内按i然后输入下文 dbpath/data/test2/shard1/db logpath/logs/test2/shard1/log/mongodb.log port21001 shardsvrtrue forktrue 按esc然后输入 :wq ,回车 vim mongod2.conf 进入文件内按i然后输入下文 dbpath/data/test2/shard2/db logpath/logs/test2/shard2/log/mongodb.log port21002 shardsvrtrue forktrue 按esc然后输入 :wq ,回车 vim mongod3.conf 进入文件内按i然后输入下文 dbpath/data/test2/shard3/db logpath/logs/test2/shard3/log/mongodb.log port21003 shardsvrtrue forktrue 按esc然后输入 :wq ,回车 mongod -f /etc/test2/mongod1.conf mongod -f /etc/test2/mongod2.conf mongod -f /etc/test2/mongod3.conf mongod --dbpath /data/test2/config/db --logpath /logs/test2/config/log/mongodb.log --port 21004 --configsvr --replSet cs --fork mongo localhost:21004 use admin cfg { _id:cs, configsvr:true, members:[ {_id:0,host:localhost:21004} ] } rs.initiate(cfg) exit mongos --configdb cs/localhost:21004 --logpath /logs/test2/mongs/log/mongodb.log --port 21005 --fork mongo localhost:21005 sh.addShard(localhost:21001) sh.addShard(localhost:21002) sh.addShard(localhost:21003) sh.status() exit mongo localhost:21005 use config db.settings .save( { _id:chunksize, value: 1 } ) sh.enableSharding(test) db.user.ensureIndex({ uid : 1}) sh.shardCollection(test.user,{uid : 1}) use test for(i0;i100000;i){db.user.insert({uid:i,username:test-i})} sh.status()MongoDB数据库安全第1关创建管理员用户编程要求根据提示在右侧命令行进行操作在数据库中创建一个具有root权限的管理员用户admin密码为123456注意管理员用户只能创建在admin数据库中。mongo use admin db.createUser({user:admin, pwd:123456, roles:[{role:root, db:admin}]})第2关按需求创建普通用户mongo use firstdb db.createUser({user:people,pwd:people,roles:[{role:read,db:firstdb}]})第3关数据库限制访问use admin db.shutdownServer() exit mongod -port 20018 --dbpath /data/db --logpath /tmp/mongodb.log --bind_ip 127.0.0.1 --forkMongoDB 实验——数据备份和恢复第1关数据备份mkdir /opt/mongodb mkdir /opt/mongodb_1 mkdir /opt/mongodb_2 mkdir /opt/collection_1 mkdir /opt/collection_2 mongoimport -d test2 -c student --type csv --headerline --ignoreBlanks --file /home/example/student.csv mongoimport -d test1 -c person --type json --file /home/example/person.json mongodump -h 127.0.0.1:27017 --authenticationDatabase admin -o /opt/mongodb mongodump -h 127.0.0.1:27017 --authenticationDatabase admin -d test1 -o /opt/mongodb_1 mongodump -h 127.0.0.1:27017 --authenticationDatabase admin -d test1 -c person -o /opt/collection_1 mongodump -h 127.0.0.1:27017 --authenticationDatabase admin -d test2 -c student -o /opt/collection_2 --gzip mongodump -h 127.0.0.1:27017 --authenticationDatabase admin -d test2 -o /opt/mongodb_2 --gzip第2关数据恢复mongorestore -h 127.0.0.1:27017 --authenticationDatabase admin --drop /opt/mongodb mongorestore -h 127.0.0.1:27017 --authenticationDatabase admin -d mytest1 /opt/mongodb_1/test1 mongorestore -h 127.0.0.1:27017 --authenticationDatabase admin -d mytest2 -c person /opt/collection_1/test1/person.bson mongorestore -h 127.0.0.1:27017 --authenticationDatabase admin -d mytest3 -c student --gzip --drop /opt/collection_2/test2/student.bson.gz mongorestore -h 127.0.0.1:27017 --authenticationDatabase admin -d mytest4 --gzip --drop /opt/mongodb_2/test2/student.bson.gzMongoDB 实验——数据库优化第1关MongoDB 查询优化原则1.CD 、2.AD、3.AC、4.ABD、5.BCD、6.ABCD、7.CD、8.AD第2关MongoDB 的 Profiling 工具一mongo use mydb db.setProfilingLevel(1,50)第3关MongoDB 的 Profiling 工具二mongo use mydb3 db.setProfilingLevel(1,5) for(var i0;i100000;i)db.items1.insert({_id:i,text:Hello MongoDBi}) for(var i0;i100000;i)db.items2.insert({_id:i,text:Hello MongoDBi})