分布式数据库NoSQL(二)——MongoDB 数据库基本操作
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 中的查询和删除。
二、相关知识
为了完成本关任务,你需要掌握:
- 查询文档命令;
- 删除文档命令。
查询文档
我们先插入文档到集合 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 数据库基本操作相关推荐
- NoSql、MongoDb 数据库介绍及MongoDb安装、使用
1.数据库和文件的主要区别 数据库有数据库表.行和列的概念,让我们存储操作数据更方便 数据库提供了非常方便的接口,可以让 nodejs.php java .net 很方便的实现增加修改删除功能 2.N ...
- Mysql 数据库(二)——数据库基础
文章目录 一.SQL 语句分类 1.DQL(数据查询语言) 2.DML(数据操纵语言) 3.DDL(数据定义语言) 4.DCL(数据控制语言) 5.TCL(事务处理语言) 二.数据库的分类 1.关系型 ...
- [数据库]---nosql,非关系型数据库整理
1.关系型数据库与非关系型数据库的区别 Tables 关系型数据库 非关系型数据库 成本 好的收费 开源的,都免费的 存储与查询 硬盘存储,相对查的慢 内存存储,查的快 存储格式 只能是基本格式 多种 ...
- 数据库监控(MongoDB数据库监控)常用指标
MongoDB 是免费开源的跨平台 NoSQL 数据库,MongoDB 高性能,高可用性.可扩展性等特点,使其至 2009 年发布以来,逐渐被认可,并被越来越多的用于生产环境中,监控需求将显得尤为迫切 ...
- Linux系统mongdb还原数据库,linux下mongodb数据库备份与还原
MongoDb数据库备份还原 数据库迁移,可视化工具NoSQLBooster for MongoDB 付费版才具有数据导入功能.代价过高,索性采起命令行web 数据备份 备份命令mongodb mon ...
- mysql与mangodb多租户_MongoDB多租户(Java):如何使用MongoClient在运行时切换具有不同数据库凭据的MongoDB数据库?...
我正面临一个关于MongoDB多租户的问题.我有两个不同的mongoDB数据库(db1和db2).这两者都有不同的凭据. db1凭据: userName:admin 密码:passwd db2凭据: ...
- php 数据库脚本初始化,MongoDB数据库设置初始化脚本
很多时候,我们需要初始化数据库的设置,比如创建索引,特别是多台MongoDB服务器要配置的时候,或者是需要将初始化存档的时候. 很多时候,我们需要初始化数据库的设置,比如创建索引,特别是多台Mongo ...
- MySQL数据库实验二 MySQL数据库和表
一.实验项目: MySQL数据库和表. 二.实验目的 1.掌握MySQL数据库的创建.修改.删除和查看. 2.掌握表的创建.修改.删除和查看. 3.掌握表中记录的插入.修改和删除操作. 4.掌握完整性 ...
- 合肥工业大学—SQL Server数据库实验二:数据库架构的创建与使用
数据库架构的创建与使用 1. 创建架构MySch 2. 创建一个登录名log1 3. 创建用户user1,关联登录名与架构 4. 创建架构Schema1,授予用户user1 5. 在当前架构DBO(默 ...
最新文章
- 微软警告称Flame病毒利用Windows漏洞
- Java编译型语言还是解释型语言
- 2021 版 Spring Boot 基础知识复习手册(2w字,建议收藏)
- C++ vector容器 find erase的使用:查找并删除指定元素
- logback slf4j_强制Tomcat通过SLF4J / Logback登录
- 模拟微信支付服务器测试,专栏 - 腾讯WeTest-All Test in WeTest
- php框架laravel_Laravel简介(PHP框架)
- BestCoder4 1002 Miaomiao's Geometry (hdu 4932) 解题报告
- urule决策引擎实现增量打包部署
- hypermedia_Hypermedia REST API简介
- React-cra项目初始化 必做操作
- ZYNQ-AXI DMA IP简介
- 案例分享:智邦科技上海办公室WLAN改造项目
- PPT 问题 PowerPoint 储存此文件时发生错误
- 计算机系统的图像编码方式,彩色图像编码方案
- confluence 空间复制
- selenium找到页面元素click没反应
- 【单片机原理及应用日志】用取模软件提取汉字字模,在LCD屏上显示界面
- Navicat Premium v12 破解教程(转)
- Python可变/不可变对象