数据库【mongodb篇】练习操作
本文的目标是通过大量的示例,来更好的理解如果在Mongodb
中进行数据操作;
初入客户端
刚利用 mongod
命令进入客户端环境,此时对数据库一无所知;
举目四望,想知道现在有哪些数据库,
show dbs;
因为是新装的mongodb
环境,所以只看到了admin
和local
两个默认就存在的数据库;目光慢慢收回,那么当前是处于哪个数据库上呢?
db;
通过上述这个命令,不仅可以知道当前在哪个数据库上;
现在切换到admin
数据库上,转一圈;
use admin;
数据库
这时候,笔者想要创建自己应用的数据库school
, 用来存放一些班级学生信息;
use school;
use
命令:如果数据库不存在,则创建数据库,否则切换到指定数据库;
突然发现刚才敲命令,写错了,写成了use school1
;这时候,希望删除school1
这个数据库,就切换到该数据库下,再键入删除命令;
use school1;
db.dropDatabase();
集合Mongodb
中的集合相当于Mysql
中的表;
作为一名优秀的“校长”,能适应高信息化社会发展,笔者需要为学校下的各个年级、班级建立集合;创建集合可以是显式的,也可以是隐式的;
通过show tables
,看到数据库下没有任何集合;笔者显式地创建“一年级一班的”集合;
db.createCollection("grade_1_1");
再次通过show tables
就可以看到列表中有grade_1_1
这个集合;
当然,也可以隐式地创建,当为集合插入数据,集合不存在,这时候集合会自动创建;现在,不存在grade_1_2
“一年级二班”这个集合,执行下面语句,为“一年级二班”加入一个学生;
db.grade_1_2.insert({"name": 'zhangsan', "age": '7', "sex": "0"});
通过show tables
就可以看到grade_1_2
这个集合了;
因为一些特殊原因,要解散一年级二班,那笔者这儿就不用继续维护grade_1_2
集合,
db.grade_1_2.drop();
练习增查
清空上面的
school
数据库use school;
db.dropDatabase();
use school;
show tables;创建一年级的3个班,并随机添加 10 名学生;
for(grade_index in (grade = ['grade_1_1', 'grade_1_2', 'grade_1_3'])) {
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": []
});
}
}查看一年级二班
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})
查看一年级二班的学生,年龄值有哪些
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})
练习删除
一年级二班
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})
练习修改
一年级二班
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"}})
练习分组
新建一个集合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;
}
})
练习聚合
根据姓名分组, 并统计人数
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}}
])
练习权限
创建用户
要让权限生效,需要
mongo
服务器启动时添加--auth
选项;
创建用户school_admin
,只能对school
数据库进行读写操作;
use school;
db.createUser({
user: "school_admin",
pwd: "school_admin",
roles: [{role: "readWrite", db: "school"}]
})
关于第三个参数角色,看下表:
角色名 | 描述 |
---|---|
Read | 允许用户读取指定数据库 |
readWrite | 允许用户读写指定数据库 |
dbAdmin | 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile |
userAdmin | 允许用户向system.users 集合写入,可以找指定数据库里创建、删除和管理用户 |
clusterAdmin | 只在admin 数据库中可用,赋予用户所有分片和复制集相关函数的管理权限 |
readAnyDatabase | 只在admin 数据库中可用,赋予用户所有数据库的读权限 |
readWriteAnyDatabase | 只在admin 数据库中可用,赋予用户所有数据库的读写权限 |
userAdminAnyDatabase | 只在admin 数据库中可用,赋予用户所有数据库的userAdmin 权限 |
dbAdminAnyDatabase | 只在admin 数据库中可用,赋予用户所有数据库的dbAdmin 权限 |
root | 只在admin 数据库中可用。超级账号,超级权限 |
验证用户
如果未通过验证,进行查询,
会得到如下的提示:
Error: error: {
"ok" : 0,
"errmsg" : "not authorized on school to execute command { find: \"grade_1_2\", filter: {} }",
"code" : 13,
"codeName" : "Unauthorized"
}
如果执行验证代码:注意,要在注册时所在的数据库中验证
use school;
db.auth('用户名', '密码')
查看所有用户
db.getUsers()
删除用户
先移到用户注册的数据库,然后移除指定用户 school_admin
db.dropUser('school_admin')
数据库【mongodb篇】练习操作的更多相关文章
- Python操作Mysql数据库进阶篇——查询操作详解(一)
前面我们已经介绍了在Python3.x中如何连接一个Mysql数据库,以及怎么样对这个数据库创建一个表,增删改查表里的数据.想必大家对Mysql数据库和简单的sql语句有了一定的了解,其实sql语句博 ...
- Python的数据库mongoDB的入门操作
Python代码: import pymongo # 获取本地端口,激活mongo客户端 client = pymongo.MongoClient('localhost',27017) # 创建一个数 ...
- 微信小游戏爆款秘笈 数据库MongoDB攻略篇
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB 发表于云+社区专栏 随着微信小游戏的爆发,越来越多开发者关注到MongoDB与小游戏业务的契合度. ...
- python操作三大主流数据库(10)python操作mongodb数据库④mongodb新闻项目实战
python操作mongodb数据库④mongodb新闻项目实战 参考文档:http://flask-mongoengine.readthedocs.io/en/latest/ 目录: [root@n ...
- python操作三大主流数据库(9)python操作mongodb数据库③mongodb odm模型mongoengine的使用
python操作mongodb数据库③mongodb odm模型mongoengine的使用 文档:http://mongoengine-odm.readthedocs.io/guide/ 安装pip ...
- python操作三大主流数据库(8)python操作mongodb数据库②python使用pymongo操作mongodb的增删改查
python操作mongodb数据库②python使用pymongo操作mongodb的增删改查 文档http://api.mongodb.com/python/current/api/index.h ...
- python操作三大主流数据库(7)python操作mongodb数据库①mongodb的安装和简单使用
python操作mongodb数据库①mongodb的安装和简单使用 参考文档:中文版:http://www.mongoing.com/docs/crud.html英文版:https://docs.m ...
- MongoDB学习day04--NodeJs操作数据库增删改查
一.在Nodejs中使用Mongodb Nodejs需要引入的包 npm install mongodb --save -dev 或者使用镜像 cnpm install mongodb --save ...
- MongoDB的CRUD操作
1. 前言 在上一篇文章中,我们介绍了MongoDB.现在,我们来看下如何在MongoDB中进行常规的CRUD操作.毕竟,作为一个存储系统,它的基本功能就是对数据进行增删改查操作. MongoDB中的 ...
- MongoDB各种查询操作详解
这篇文章主要介绍了MongoDB各种查询操作详解,包括比较查询.关联查询.数组查询等,需要的朋友可以参考下 一.find操作 MongoDB中使用find来进行查询,通过指定find的第一个参数可 ...
随机推荐
- grep 及正则表达式
grpe 及正则表达式 文本查找的需要:grep,egrep,fgrepgrep: 根据模式,搜索文本,并将符合模式的文本行显示出来.Pattern : 文本字符以及正则表达式的元字符组合而成的匹配条 ...
- 解决 mac 10.14.4 无法 sublime text 3207 安装 Package Control,以及安装第三方包报错 `Package Control There are no packages available for installation`
下载最新的 sublime text 3207,无法安装 Package Control. 根据官方提示,手动安装 Package Control. 手动安装 Package Control 后,无法 ...
- 关于Django报错django.core.exceptions.ImproperlyConfigured: Requested setting DEBUG, but settings are not configure
报错代码:django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but se ...
- mysql用户创建授权
创建用户: grant select,update,insert,delete,create,drop,alter,index on *.* to 'jyx_mysql'@'%' identified ...
- 利用requirejs实现vue的模块化开发
通常vue都是搭配webpack+vue-cli使用的 如果不在nodejs环境下开发web应用呢? 这里提出一个解决方案: 1.加载requirejs,并且指定main函数 <script d ...
- dotnet中Stream、string及byte[]的相关操作
string与byte[](UTF-8) //string to byte[] string str = "abc中文"; //0x61 0x62 0x63 0xE4 0xB8 0 ...
- SQL注入攻击的常见方式及测试方法
本文主要针对SQL注入的含义.以及如何进行SQL注入和如何预防SQL注入让小伙伴有个了解.适用的人群主要是测试人员,了解如何进行SQL注入,可以帮助我们测试登录.发布等模块的SQL攻击漏洞,至于如何预 ...
- Mysql查询的一些操作(查表名,查字段名,查当月,查一周,查当天)
查询数据库中所有表名 select table_name from information_schema.tables where table_schema='tools' and table_typ ...
- mybatis-generator : 自动生成代码
[参考文章]:mybatis generator自动生成代码时 只生成了insert 而没有其他 [参考文章]:Mybatis Generator最完整配置详解 1. pom <plugin&g ...
- Docker & ASP.NET Core (4):容器间的连接
第一篇:把代码连接到容器 第二篇:定制Docker镜像 第三篇:发布镜像 Docker容器间的连接 Docker提供了两种方式可以用来做容器间的连接/通信: Legacy Linking:这种方式使用 ...