本文的目标是通过大量的示例,来更好的理解如果在Mongodb中进行数据操作;

初入客户端
刚利用 mongod命令进入客户端环境,此时对数据库一无所知;

举目四望,想知道现在有哪些数据库,

 
show dbs;

因为是新装的mongodb环境,所以只看到了adminlocal两个默认就存在的数据库;目光慢慢收回,那么当前是处于哪个数据库上呢?

 
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();

练习增查

  1. 清空上面的school数据库

     
    use school;
    db.dropDatabase();
    use school;
    show tables;
  2. 创建一年级的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": []
    });
    }
    }
  3. 查看一年级二班grade_1_2中的所有学生

     
    db.getCollection('grade_1_2').find({})
  4. 查看一年级二班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}}]})
  5. 查看一年级二班grade_1_2中所有年龄是 4 岁或 6 岁的学生

     
    db.getCollection('grade_1_2').find({"age": {$in: [4, 6]}})
  6. 查看一年级二班grade_1_2中所有姓名带zhangsan1的学生

     
    db.getCollection('grade_1_2').find({"name": {$regex: "zhangsan1"}})

    查看一年级二班grade_1_2中所有姓名带zhangsan1zhangsan2的学生

     
    db.getCollection('grade_1_2').find({"name": {
    $in: [new RegExp(""zhangsan1"), new RegExp(""zhangsan2")]
    }})
  7. 查看一年级二班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"]}})
  8. 查看一年级二班grade_1_2中所有兴趣爱好有三项的学生的学生数目

     
    db.getCollection('grade_1_2').find({"hobby": {$size: 3}}).count()
  9. 查看一年级二班的第二位学生

     
    db.getCollection('grade_1_2').find({}).limit(1).skip(1)
  10. 查看一年级二班的学生,按年纪升序

     
    db.getCollection('grade_1_2').find({}).sort({"age": 1})
     
    查看一年级二班的学生,按年纪降序
     
    db.getCollection('grade_1_2').find({}).sort({"age": -1})
  11. 查看一年级二班的学生,年龄值有哪些

     
    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})

练习删除

  1. 一年级二班grade_1_2, 删除所有 4 岁的学生

     
    db.getCollection('grade_1_2').remove({"age": 4})
  2. 一年级二班grade_1_2, 删除第一位 6 岁的学生

     
    db.getCollection('grade_1_2').remove({"age": 6}, {justOne: 1})

练习修改

  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"]}}})
  2. 新学年,给一年级二班所有学生的年龄都增加一岁

     
     db.getCollection('grade_1_2').update({}, {$inc: {"age": 1}}, {multi: true})
  3. 一年级二班grade_1_2中,删除zhangsan7学生的sex属性

     
     db.getCollection('grade_1_2').update({"name": "zhangsan7"}, {$unset: {"sex": 1}})
  4. 一年级二班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)
}
});
}
  1. 统计每名学生在考试中的总分

     
       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 }
    })
  2. 统计每名男生在考试中的总分

     
       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 }
    })
  3. 统计每名男生在考试中的总分及平均分

     
       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;
    }
    })

练习聚合

  1. 根据姓名分组, 并统计人数

     
       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}}}
    ])
  2. 统计每名学生在考试中的总分

     
       db.getCollection('grade_1_4').aggregate([
    {$group: {_id: "$name", score: {$sum: {$sum: ["$score.chinese", "$score.math", "$score.english"]}}}}
    ])
  3. 统计每名男生在考试中的总分

     
    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篇】练习操作的更多相关文章

  1. Python操作Mysql数据库进阶篇——查询操作详解(一)

    前面我们已经介绍了在Python3.x中如何连接一个Mysql数据库,以及怎么样对这个数据库创建一个表,增删改查表里的数据.想必大家对Mysql数据库和简单的sql语句有了一定的了解,其实sql语句博 ...

  2. Python的数据库mongoDB的入门操作

    Python代码: import pymongo # 获取本地端口,激活mongo客户端 client = pymongo.MongoClient('localhost',27017) # 创建一个数 ...

  3. 微信小游戏爆款秘笈 数据库MongoDB攻略篇

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB 发表于云+社区专栏 随着微信小游戏的爆发,越来越多开发者关注到MongoDB与小游戏业务的契合度. ...

  4. python操作三大主流数据库(10)python操作mongodb数据库④mongodb新闻项目实战

    python操作mongodb数据库④mongodb新闻项目实战 参考文档:http://flask-mongoengine.readthedocs.io/en/latest/ 目录: [root@n ...

  5. python操作三大主流数据库(9)python操作mongodb数据库③mongodb odm模型mongoengine的使用

    python操作mongodb数据库③mongodb odm模型mongoengine的使用 文档:http://mongoengine-odm.readthedocs.io/guide/ 安装pip ...

  6. python操作三大主流数据库(8)python操作mongodb数据库②python使用pymongo操作mongodb的增删改查

    python操作mongodb数据库②python使用pymongo操作mongodb的增删改查 文档http://api.mongodb.com/python/current/api/index.h ...

  7. python操作三大主流数据库(7)python操作mongodb数据库①mongodb的安装和简单使用

    python操作mongodb数据库①mongodb的安装和简单使用 参考文档:中文版:http://www.mongoing.com/docs/crud.html英文版:https://docs.m ...

  8. MongoDB学习day04--NodeJs操作数据库增删改查

    一.在Nodejs中使用Mongodb Nodejs需要引入的包 npm install mongodb --save -dev 或者使用镜像 cnpm install mongodb --save ...

  9. MongoDB的CRUD操作

    1. 前言 在上一篇文章中,我们介绍了MongoDB.现在,我们来看下如何在MongoDB中进行常规的CRUD操作.毕竟,作为一个存储系统,它的基本功能就是对数据进行增删改查操作. MongoDB中的 ...

  10. MongoDB各种查询操作详解

    这篇文章主要介绍了MongoDB各种查询操作详解,包括比较查询.关联查询.数组查询等,需要的朋友可以参考下   一.find操作 MongoDB中使用find来进行查询,通过指定find的第一个参数可 ...

随机推荐

  1. Windows -- cmd命令: netstat 和 arp

    1. netstat: 显示网络连接.路由表和网络接口信息,可以让用户得知有哪些网络连接正在运作. 命令格式及参数如下: 2. ARP: 可用于查询本机ARP缓存中IP地址和MAC地址的对应关系.添加 ...

  2. [ gczdac ] 20190306 访者必阅

    1.我的私人博客!!! 2.博主还处于入门学习阶段,并且非常玻璃心 3. 激烈讨论√  人身攻击× 4. 欢迎指正错误,相互学习 5. 很少在线,无法及时回复请谅解 https://www.cnblo ...

  3. Vue2.x源码学习笔记-Vue源码调试

    如果我们不用单文件组件开发,一般直接<script src="dist/vue.js">引入开发版vue.js这种情况下debug也是很方便的,只不过vue.js文件代 ...

  4. Beyond Compare 3.3.8 build 16340 + Key

    本文摘录自冰点社区:http://forum.z27315.com/topic/14746-beyond-compare-338-build-16340-key/ Download Beyond Co ...

  5. cassandra读源码---Streaming

    前言 cassandra的很多过程需要网络传输模块,需要在各个节点直接发送文件.包括加入节点,删除节点引起的不同节点的负责ring环的key值发生了变化,导致sstable需要在各个节点中移动. 整体 ...

  6. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十五 ║Vue基础:JS面向对象&字面量& this字

    缘起 书接上文<从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十四 ║ VUE 计划书 & 我的前后端开发简史>,昨天咱们说到了以我的经历说明的web开发经历的 ...

  7. springcloud~配置中心的使用

    配置中心作为springcloud里最底层的框架,所发挥的意思是举足轻重的,所以的组件的配置信息都可以通过springcloud config来管理,它会把配置信息分布式的存储到git上,所以信息安全 ...

  8. @vue-cli3安装element组件过程

    在创建好的项目目录下 执行: vue add element 如图选择对应的选项 安装成功!KO!

  9. JSP 内置对象(上)

    JSP 内置对象是 Web 容器创建的一组对象,不使用 new 关键字就可以直接使用的对象.如上一章中使用脚本实现打印九九乘法表中的out对象 <%-- 脚本:out对象是JSPWriter类的 ...

  10. python3-列表字典简单练习题

    .求全部元素的和[,,,,,,,] >>> a=[,,,,,,,] >>> result= >>> for i in a: ... result+ ...