练习 MongoDB 操作 —— 数据操作(一)

目录

  • 练习 MongoDB 操作 —— 数据操作(一)

    • # 练习增查
    • 练习删除
    • 练习修改
    • 练习分组
    • 练习聚合
    • 练习权限
      • 创建用户
      • 验证用户
      • 查看所有用户
      • 删除用户

练习 MongoDB 操作 —— 数据操作(一)

mongodb

更新于 2017-09-19 约 18 分钟
原文链接: https://segmentfault.com/a/1190000011173681

本文的目标是通过大量的示例,来更好的理解如果在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')

关于用户的注册位置,笔者的理解是在admin下创建其他数据库的管理者,再由这些管理者在对应的数据库下创建“可读”或“可写”的用户;

文章来源于网络,仅用于学习,如有侵权,请联系删除。

原文地址:https://www.cnblogs.com/qzdd/p/12329993.html

时间: 2024-08-02 10:48:51

练习 MongoDB 操作 —— 数据操作(一)的相关文章

mongodb常用数据操作

1. shell操作 mongodb默认连接的是test数据库, 输入db,可以看到当前数据库为test, 接下来是常用的数据库操作 ????mongodb存储按照文档方式存储,各种操作均采用json格式串进行, ????????可以理解为. mongodb的集合就是关系数据库的表,集合里面可以装各种类型的数据,包括集合. ? ????show databases:显示数据库以及数据库所占空间. 简写为show dbs; ????use [dbname]: 选择数据库 ????show coll

Mongodb for PHP教程之数据操作

Mongodb的常用操作 参看手册,php官方的http://us2.php.net/manual/en/mongo.manual.php 也可以参看mongodb官方的教程 数据库连接 ⑴默认格式 $m = new Mongo(); //这里采用默认连接本机的27017端口,当然你也可以连接远程主机如                   192.168.0.4:27017,如果端口是27017,端口可以省略 ⑵标准连接 $m = new Mongo("mongodb://${username}

Mongodb DB shell数据操作

shell命令操作语法和JavaScript很类似,其实控制台底层的查询语句都是用JavaScript脚本完成操作的. Ø 数据库 1.Help查看命令提示 help db.help(); db.yourColl.help(); db.youColl.find().help(); rs.help(); 2.切换/创建数据库 >use yourDB; 当创建一个集合(table)的时候会自动创建当前数据库 3.查询所有数据库 show dbs; 4.删除当前使用数据库 db.dropDatabas

MongoDB之数据库命令操作(二)

现在详细学习一下mongodb的数据库操作. 查询语句 db.xxx(集合name).find() # 查询 db.xxx(集合name).findOne() # 只返回一个 db.xxx(集合name).findOne().pretty() # 返回结果格式化 # 比较运算符 等于,默认是等于判断,没有运算符,如:db.xxx(集合name).find({name:"xiao"}) 小于$lt,如:db.xxx(集合name).find({age:{$lt:30}}) 小于或等于$l

Ruby操作MongoDB(进阶)-CRUD操作

MongDB数据库的使用离不开CRUD操作.什么是CRUD,就是创建文档,读取文档信息,更新文档和删除文档. key-value键值对标记 在MongoDB的Ruby驱动中,Key_value键值多次出现.而且有时会出现语法上的巧合,这取决于在使用的Ruby版本中如何申明. 在文档创建步骤中,1.9及之后版本支持以下语法: document={name:"Tom",age:20}. 但是如果你使用的是2.2或者更高的版本,你可以用双引号将你的key包起来.如: document={&q

【翻译】MongoDB指南/CRUD操作(二)

[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关注),写确认(写关注) 1 更新文档 1.1 更新 MongoDB提供下列方法用于更新一个集合 db.collection.updateOne() 更新使用指定过滤器匹配到的文档,即使过滤器匹配到多个文档,也只会更新一个文档. 3.2版本新增特性. db.collection.updateMany(

MongoDB 的聚集操作

聚合引言 聚集操作就是出来数据记录并返回计算结果的操作.MongoDB提供了丰富的聚集操作,能够检测和执行数据集上的计算.运行在mongod上的数据聚集简化了代码和资源限制. 像查询一样,在Mongo的聚合操作使用collections作为输入,并返回一个或多个document作为输出. 聚合模式 聚合管道 MongoDB2.2引入了一个新的聚合框架:聚合管道,这是基于数据处理管道概念的模型.文档输入一个多阶段的管道并将文档转化为一个聚合的结果. 最基本的管道阶段提供了过滤器(Filters)来

【翻译】MongoDB指南/CRUD操作(一)

[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(一) 主要内容:CRUD操作简介,插入文档,查询文档. CRUD操作包括创建.读取.更新和删除文档. 创建操作 执行创建或者插入操作可向集合中添加文档.如果集合不存在,插入操作会创建此集合. MongoDB提供下列方法向集合中插入文档: db.collection.insert() db.collection.insertOne()  3.2版本新增 db.collection.inser

MongoDB Shell 常用操作

数组查询 数组查询 MongoDB 中有子文档的概念,一个文档中能方便的嵌入子文档,这与关系性数据库有着明显的不同,在查询时,语法有一些注意点. 例子代码,假如我们的一个集合(tests)中存在标签键,有如下模式: tags: [ObjectId] 查询含有某个标签 ID 的文档 db.tests.find({tags: tagId}); 我现在有一组标签 tagIds,即是数组,需要查询含有该数组中任一元素的文档,此时需要用到 $in 操作符 db.tests.find({tags: {$in