MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型。

MongoDB 最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

从目前阿里云 MongoDB 云数据库上的用户看,MongoDB 的应用已经渗透到各个领域,比如游戏、物流、电商、内容管理、社交、物联网、视频直播等,以下是几个实际的应用案例。

  • 游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新;

  • 物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来;

  • 社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能;

  • 物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析;

  • 视频直播,使用 MongoDB 存储用户信息、礼物信息等;

  • ……

本实训带你学习 MongoDB 的基础操作。

第1关:数据库创建

一、任务描述

本关任务:创建数据库。

二、相关知识

本关评测是在 Linux 环境下进行的,MongoDB 的安装与配置测评系统均已默认完成。

为了完成本关任务,你需要掌握: 1.如何连接数据库; 2.如何创建数据库。

连接数据库

MongoDB 安装完成后,可以通过 pgrep mongo -l 命令来查看是否已经启动。

在操作数据库之前,需要连接它,连接本地数据库服务器,输入命令:mongo,预期输出如图:

其中连接的警告可以不用管,只要最下方出现“ > ”符号,就说明连接成功。

创建数据库

连接上 MongoDB 之后就可以进行数据库的操作了,接下来我们创建一个名为 Testdb 的数据库,用命令:use Testdb 语句来创建(如果数据库不存在,则创建数据库,如果该数据库已存在,则切换到指定数据库)

查看所有数据库我们可以通过 show dbs 命令来查看

然而并没有我们刚创建的 Testdb 数据库。要想显示它,我们需要向数据库插入一些数据:db.Testdb.insert({_id:1,name:"王小明"}),如图所示:

现在,就可以看到我们创建的数据库 Testdb 了。

删除数据库

MongoDB 删除数据库需要先切换到该数据库中:use Testdb

然后再执行删除命令:db.dropDatabase()

编程要求

在右侧命令行中连接 MongoDB ,创建一个名为 mydb 的数据库,并插入数据:_id:1,name:"李小红"。

测试说明

操作完之后点击评测,平台会对你的创建的数据库和插入的数据进行测试,如果数据库创建成功且数据插入完成,平台会输出如图7所示的结果。

提示:如果右侧命令行无响应,是因为云端二十分钟会自动关闭容器,重新刷新页面即可解决问题,刷新之后环境会重置,所以你还需要重新创建数据库和表。

mongo                   #连接MongoDB

> use mydb
switched to db mydb
> db.mydb.insert({_id:1,name:"李小红"})
WriteResult({ "nInserted" : 1 })

第2关:创建集合

一、任务描述

本关任务:在数据库中创建一个集合。

二、相关知识

MongoDB 数据库中的集合相当于 MySQL 数据库中的

为了完成本关任务,你需要掌握: 1.如何在指定的数据库创建集合; 2.查看集合; 3.删除集合。

在指定的数据库创建集合

先进入指定数据库 Testdb:

use Testdb

在Testdb数据库中创建创建固定集合test  整个集合空间大小512000KB,文档最大个数为1000个。

db.createCollection("test", { capped : true, autoIndexId : true, size : 512000, max : 1000 } )
  • capped :是一个布尔类型,true 时创建固定集合,必须指定 size。固定集合指有固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。默认为 false;

  • autoIndexId :也是一个布尔类型,如为 true,自动在_id 字段创建索引。默认为 false ;

  • size :为固定集合指定一个最大值(以字节 KB 计);

  • max :指定固定集合中包含文档的最大数量。

不过,和 MySQL 不同的是,在 MongoDB 中,你不一定需要先创建集合。当你插入一些文档时,MongoDB 会自动创建集合。

创建集合命令(推荐)db.集合名.insert()(注意:一条数据用大括号“ {} ”括起来,多条数据用“ [] ”将所有数据括起来)。

db.test.insert([{"name" : "王小明","sex":"男"},{"name" : "李小红","sex":"女"}])

默认 id

MongoDB 中存储的文档 必须 有一个_id键(如果我们插入数据的时候未指定_id,系统会自动生成一个默认的 id )。这个键的值可以是任何类型的,默认是个 ObjectId 对象。在一个集合里面,每个文档都有唯一的_id值,来确保集合里面每个文档都能被唯一标识。如果有两个集合的话,两个集合可以都有一个值为123的_id键,但是每个集合里面只能有一个_id是123的文档。

查询集合

查询集合命令:db.集合名.find()。由此我们也能看到 MongoDB 默认创建的_id,如图所示;

删除集合

删除集合命令:db.集合名.drop()

编程要求

在右侧命令行中操作,创建数据库 Testdb2,创建集合 t_stu ,内容如图所示:

测试说明

操作完之后点击评测,平台会对你的创建的集合进行测试,如果集合创建成功,平台会输出如图所示的结果。

提示:如果右侧命令行无响应,是因为云端二十分钟会自动关闭容器,重新刷新页面即可解决问题,刷新之后环境会重置,所以你还需要重新创建数据库和表。

操作如下:(">" 之后的才需要输入)

mongo                #进入MongoDB
> use Testdb2
switched to db 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()
{ "_id" : 1, "name" : "小明", "sex" : "男", "hobbies" : [ "乒乓球", "羽毛球" ] }
{ "_id" : 2, "name" : "小红", "sex" : "女", "hobbies" : [ "画画", "唱歌" ] }

第3关:文档操作一

一、任务描述

本关任务:文档数据在 MongoDB 中的插入和更新。

二、相关知识

本章节中我们将向大家介绍文档数据在 MongoDB 中的基本操作。

文档的数据结构和 JSON 基本一样,所有存储在集合中的数据都是 BSON 格式。BSON 是一种类 JSON 的一种二进制形式的存储格式,简称: Binary JSON 。

为了完成本关任务,你需要掌握: 1.插入文档命令; 2.更新文档的两种方法。

插入文档

插入文档命令:db.集合名.insert(文档)。 该命令前面两关我们也有用到。除了前两关的用法以外,我们还可以将数据定义为一个变量,如下所示:

document=({_id:1,       name: '王小明',sex: '男',hobbies: ['乒乓球','羽毛球'],birthday: '1996-02-14'});

然后执行插入操作:

db.person.insert(document)person 是集合名,如果该集合不在该数据库中,MongoDB 会自动创建该集合并插入文档,查看 person 集合,如图所示:

更新文档

更新文档主要会用到 update() 方法和 save() 方法。

update() 方法

我们先把 document 插入到集合 person2;

db.person2.insert(document)

由于信息有误,上面 birthday 的格式错了,该怎么去修改这个字段的值呢?这时就要用到 update() 方法了。

用 update() 方法来更新 person2 的数据,把王小明的出生日期替换成1996,命令如下:

db.person2.update({birthday:"1996-02-14"},{$set:{birthday:"1996"}})

更新后如图所示( pretty() 方法的作用是使文档整齐的输出):

可以发现:

  • update() 有两个参数,都是对象,中间用逗号“ ,”间隔;
  • 第一个参数表示需要修改的值;
  • 第二个参数用 $set 操作符指向更新后的值。

save() 方法

save() 方法通过传入的文档替换已有文档

我们先把 document 插入到集合 person3 中;

db.person3.insert(document)

如果这时我们把一个人的数据都弄错了,怎么办呢?这时用 save() 方法来更新修改一下 person3 的数据就比较方便。

用 save() 方法把王小明的数据修改为李小红的数据:

db.person3.save({"_id" :1,name" : "李小红","sex" : "女","hobbies" : ["画画","唱歌","跳舞"],"birthday" : "1996-06-14"})

注:如果 save() 法也指定_id,则对文档进行更新未指定_id则会执行插入功能,MongoDB 默认自动生成一个不重复的_id

总结:

  • update() 方法仅适用于修改某条数据中的某个键值;

  • save() 方法适用于修改整条数据。

编程要求

现在有文档数据如下:

_id 1
name 张小华
sex
phone 12356986594
hobbies 打篮球,踢足球,唱歌
  • 使用 Testdb3 数据库,把它赋值给变量 document ,插入到集合 stu1 、stu2 、stu3 中;

  • 然后对集合 stu2 使用 update() 方法,把 phone 的值更新为18356971462;

  • 对集合 stu3 使用 save() 方法,用下面张晓晓的信息替换掉张小华的信息。

_id 1
name 张晓晓
sex
phone 12365498704
hobbies 跳舞,羽毛球,唱歌

测试说明

操作完之后点击评测,平台会对你的操作进行测试,如果操作正确,预期输出如图3所示的结果:

提示 : 如果右侧命令行无响应,是因为云端二十分钟会自动关闭容器,重新刷新页面即可解决问题,刷新之后环境会重置,所以你还需要重新创建数据库和表。

> use Testdb3
switched to db Testdb3
> document=({"_id" : 1,"name" : "张小华","sex" : "男","phone" : '12356986594',"hobbies" : [ "打篮球","踢足球","唱歌" ]})
{"_id" : 1,"name" : "张小华","sex" : "男","phone" : "12356986594","hobbies" : ["打篮球","踢足球","唱歌"]
}
> db.stu1.insert(document)
WriteResult({ "nInserted" : 1 })
> db.stu2.insert(document)
WriteResult({ "nInserted" : 1 })
> db.stu3.insert(document)
WriteResult({ "nInserted" : 1 })
> db.stu2.update({"phone" : '12356986594'},{$set:{"phone" : '18356971462'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.stu3.save({"_id" : 1,"name" : "张晓晓","sex" : "女","phone" : '12365498704',"hobbies" : [ "跳舞","羽毛球","唱歌" ]})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

第4关:文档操作二

一、任务描述

本关任务:文档数据在 MongoDB 中的查询和删除。

二、相关知识

为了完成本关任务,你需要掌握:

  1. 查询文档命令;
  2. 删除文档命令。

查询文档

我们先插入文档到集合 stu1 :

document=([{name:'张小华',sex:'男',age:20,phone:'12356986594',hobbies:['打篮球','踢足球','唱歌']},
{name:'李小红',sex:'女',age:18,phone:'12355487536',hobbies:['跳舞','唱歌']}])
db.stu1.insert(document)

然后查看 stu1 ,命令和结果如图所示(因为我们没有设置_id,所以 MongoDB 会默认生成):

上述显示的文档格式不够整齐,我们可以使用 pretty() 方法,使输出更整齐,如图所示:

条件查询

操作 格式 范例 关系数据库中类似的语句
等于 {<key>:<value>} db.stu1.find({"name":"李小红"}).pretty() where name = '李小红'
小于 {<key>:{$lt:<value>}} db.stu1.find({"age":{$lt:18}}).pretty() where age < 18
小于或等于 {<key>:{$lte:<value>}} db.stu1.find({"age":{$lte:18}}).pretty() where age <= 18
大于 {<key>:{$gt:<value>}} db.stu1.find({"age":{$gt:18}}).pretty() where age > 18
大于或等于 {<key>:{$gte:<value>}} db.stu1.find({"age":{$gte:18}}).pretty() where age >= 18
不等于 {<key>:{$ne:<value>}} db.stu1.find({"age":{$ne:18}}).pretty() where age != 18

现在我们来查找一下 age 大于18岁的数据,命令和效果如图所示:

AND 条件

find() 方法可以传入多个键 (key),每个键 (key) 以逗号隔开,即常规 SQL 的 AND 条件。如查询集合 stu1 中年龄为20岁的男性信息:

db.stu1.find({"age":20, "sex":"男"}).pretty()

查询结果如图所示:

删除文档数据

删除指定的数据:

db.stu1.remove({'age':20})           //删除年龄为20的数据

查看该集合的内容,如果只剩下如图所示的信息,说明数据删除成功:

删除全部数据(集合并不会删除):

db.remove({})

查看该集合的内容,如果如图6所示,无显示或者显示为空,说明数据全部删除:

编程要求

现有文档数据如下:

_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 傣族
  • 把上述数据赋值给变量 document (一条命令),插入到集合 stu1 、stu2;

  • 执行查询命令,查找集合 stu1 中年龄大于等于15岁的女生;

  • 执行查询命令,查找集合 stu1 中苗族人;

  • 执行查询命令,查找集合 stu1 中年龄小于20岁的男生;

  • 执行删除命令,删除集合 stu2 的所有数据。

上述操作共有六条命令,请按要求填入右侧代码栏 Begin-End 中,每条命令以英文分号“ ;”号隔开(由于测试需要,请在“ $ ” 前加 “ \ ” (转义符),平时在命令窗口练习不需要加“ \ ”)。

测试说明

操作完之后点击评测,平台会对你的操作测试,如果操作成功,平台会输出如 测试集1所示的结果,否则会显示报错信息。

提示 : 如果右侧命令行无响应,是因为云端二十分钟会自动关闭容器,重新刷新页面即可解决问题,刷新之后环境会重置,所以你还需要重新创建数据库和表。

#########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#########

分布式数据库NoSQL(二)——MongoDB 数据库基本操作相关推荐

  1. NoSql、MongoDb 数据库介绍及MongoDb安装、使用

    1.数据库和文件的主要区别 数据库有数据库表.行和列的概念,让我们存储操作数据更方便 数据库提供了非常方便的接口,可以让 nodejs.php java .net 很方便的实现增加修改删除功能 2.N ...

  2. Mysql 数据库(二)——数据库基础

    文章目录 一.SQL 语句分类 1.DQL(数据查询语言) 2.DML(数据操纵语言) 3.DDL(数据定义语言) 4.DCL(数据控制语言) 5.TCL(事务处理语言) 二.数据库的分类 1.关系型 ...

  3. [数据库]---nosql,非关系型数据库整理

    1.关系型数据库与非关系型数据库的区别 Tables 关系型数据库 非关系型数据库 成本 好的收费 开源的,都免费的 存储与查询 硬盘存储,相对查的慢 内存存储,查的快 存储格式 只能是基本格式 多种 ...

  4. 数据库监控(MongoDB数据库监控)常用指标

    MongoDB 是免费开源的跨平台 NoSQL 数据库,MongoDB 高性能,高可用性.可扩展性等特点,使其至 2009 年发布以来,逐渐被认可,并被越来越多的用于生产环境中,监控需求将显得尤为迫切 ...

  5. Linux系统mongdb还原数据库,linux下mongodb数据库备份与还原

    MongoDb数据库备份还原 数据库迁移,可视化工具NoSQLBooster for MongoDB 付费版才具有数据导入功能.代价过高,索性采起命令行web 数据备份 备份命令mongodb mon ...

  6. mysql与mangodb多租户_MongoDB多租户(Java):如何使用MongoClient在运行时切换具有不同数据库凭据的MongoDB数据库?...

    我正面临一个关于MongoDB多租户的问题.我有两个不同的mongoDB数据库(db1和db2).这两者都有不同的凭据. db1凭据: userName:admin 密码:passwd db2凭据: ...

  7. php 数据库脚本初始化,MongoDB数据库设置初始化脚本

    很多时候,我们需要初始化数据库的设置,比如创建索引,特别是多台MongoDB服务器要配置的时候,或者是需要将初始化存档的时候. 很多时候,我们需要初始化数据库的设置,比如创建索引,特别是多台Mongo ...

  8. MySQL数据库实验二 MySQL数据库和表

    一.实验项目: MySQL数据库和表. 二.实验目的 1.掌握MySQL数据库的创建.修改.删除和查看. 2.掌握表的创建.修改.删除和查看. 3.掌握表中记录的插入.修改和删除操作. 4.掌握完整性 ...

  9. 合肥工业大学—SQL Server数据库实验二:数据库架构的创建与使用

    数据库架构的创建与使用 1. 创建架构MySch 2. 创建一个登录名log1 3. 创建用户user1,关联登录名与架构 4. 创建架构Schema1,授予用户user1 5. 在当前架构DBO(默 ...

最新文章

  1. 微软警告称Flame病毒利用Windows漏洞
  2. Java编译型语言还是解释型语言
  3. 2021 版 Spring Boot 基础知识复习手册(2w字,建议收藏)
  4. C++ vector容器 find erase的使用:查找并删除指定元素
  5. logback slf4j_强制Tomcat通过SLF4J / Logback登录
  6. 模拟微信支付服务器测试,专栏 - 腾讯WeTest-All Test in WeTest
  7. php框架laravel_Laravel简介(PHP框架)
  8. BestCoder4 1002 Miaomiao's Geometry (hdu 4932) 解题报告
  9. urule决策引擎实现增量打包部署
  10. hypermedia_Hypermedia REST API简介
  11. React-cra项目初始化 必做操作
  12. ZYNQ-AXI DMA IP简介
  13. 案例分享:智邦科技上海办公室WLAN改造项目
  14. PPT 问题 PowerPoint 储存此文件时发生错误
  15. 计算机系统的图像编码方式,彩色图像编码方案
  16. confluence 空间复制
  17. selenium找到页面元素click没反应
  18. 【单片机原理及应用日志】用取模软件提取汉字字模,在LCD屏上显示界面
  19. Navicat Premium v12 破解教程(转)
  20. Python可变/不可变对象

热门文章

  1. 钉钉python 自动发消息_用Python自动发送钉钉数据消息
  2. 几个方法,教你PDF转换成图片怎么做?
  3. Centos安装MySQL详细步骤(亲妈级教程)
  4. linux中的 主设备号与次设备号
  5. 自定义TextView字间距
  6. SpringBoot+mysql搭建微信小程序后台(3)小程序端的编写
  7. html如何调图片透明度,css图片怎么设置透明度?
  8. oracle添加创建视图权限不足,Oracle Scott创建视图权限不足解决办法
  9. centos下实现mysql自动备份
  10. 用Python写一段生成饼形图代码