MongoDB-数据库安装及常见操作-001

学习收获

  • 了解基本概念
  • 了解软件的安装
  • 熟悉MongoDB常见操作

 

 

 

 任务1:MongoDB简介

        大家在之前的数据库中已经学习过了关系型数据库MySQL,今天来给大家介绍一款非关系型数据库。

​ MognoDB 与关系型数据库不同,其无schema(表结构),文档内容可以非常灵活的定制。

​ 以我们目前我们非常流行的电商业务,它有一个基本的功能模块是存储品类丰富的商品信息。我们知道,各种商品的特性、参数各不相同。MongoDB 灵活的文档模型就非常适合于这类业务。

二者区别:

MySQL的数据存储解决方案

1)针对不同商品,创建不同的表。这种做法的主要问题在于:针对每个新的商品分类,都需要创建新的表,建表过程费时费力;当需要查询多个商品的时候需要扫描多张表,比较费时;

2)所有商品存储到单张表。这种做法将所有的商品存储到一张表,这张表包含所有商品需要的属性,不同的商品根据需要设置不同的属性,这种方法使得商品查询比较简单,并且允许一个查询跨多种商品,但缺点是浪费的空间比较多。

3)公共的属性提取出来建表,特有的属性各自建表。这种做法的主要问题在于,当涉及到商品的多个属性的时候,需要用到表关联或者子查询,比较耗费时间。

MongoDB的数据存储解决方案

 相比较而言,MongoDB的存储优势体现出来了。与MySQL不同,MongoDB无表结构的概念,文档内容可以非常灵活的去定制,能很好的满足上述商品分类存储的需求; 将商品信息存储在一个集合里,集合里不同的商品可以自定义文档内容。


1.1 定义

        MongoDB是由C++语言编写的一款开源的文档数据库。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储为一个文档,数据结构由键值对(Key—value)组成,MongoDB文档类似于JSON对象,字段值可以包含其他文档,数组及文档数组。

1.2 主要特点

高性能

高可用性

自动扩展

免费开源

操作简单

良好的技术支持

1.3 基本概念

MongoDB三元素:数据库、集合和文档。

集合:collection,就是MongoDB文档组,类似于MySQL中的表格(table)。

 ​ 文档:document,是花括号括起来的一组键值(key-value)对。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

 

文档里常见的数据类型如下:

​ String: 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。

Integer: 整型数值。用于存储数值。

Double:双精度浮点值,用于存储浮点值。

​ Array: 用于将数组或列表或多个值存储为一个键。

​ Object:用于内嵌文档

​ Null:用于创建空值

​ Object ID:对象ID,用于创建文档的ID

​ Boolean: 布尔值。用于存储布尔值(真/假)

​ Date:日期时间


任务2:MongoDB安装

以 MongoDB4.0 为例,说明MongoDB的安装过程。

需要MongoDB 安装包的可以私信我发或者关注vx→凌晨笔记获取

1)双击 mongodb-win32-x86_64-2008plus-ssl-4.0.2-signed.msi ,等待一会儿,将会看到MongoDB的安装界面:

2)点击“next”按钮,进入许可协议确认界面:

 3)勾选“I accept the terms in the License Agreement”,点击“next”,进入安装类型选择的界面:

 4)选择“complete”安装类型,这是安装的推荐类型,点击“next”,进入服务配置界面:

 

5)不需要修改页面的默认选择,直接点击“next”,进入MongoDB Compass安装界面:

 

 6)需要取消“Install MongoDB Compass”前的勾选,不然容易卡死在这一步。点击“next”,进入到准备安装界面:

 7)点击“install”按钮,进行安装。等待安装结束,点击“finish”:

 8)验证MongoDB是否安装成功:打开cmd命令行窗口,将当前路径切换到MongoDB的bin目录下:

 输入指令mongo,如果出现MongoDB的版本,出现">"后的光标闪烁,即表示MongoDB安装成功:


 

 

任务3:MongoDB常用操作

MongoDB常用操作围绕着MongoDB三元素展开,其中以文档的操作为学习的重点。文档操作的学习,又以文档查询的操作为重中之重。

1 查看当前连接下的数据库列表

show dbs;

 2 创建数据库

use 数据库名;

两重含义:

如果use后跟的数据库名当前连接下有,那么就是选择该数据库连接过去;

如果use后跟的数据库名当前连接下没有,那么就创建该数据库并连接到该数据库。

举例:

use a;

 3 显示当前连接的是哪个数据库

db;

 4 查看当前数据库下有哪些集合

show collections;

 5 如何创建集合并插入文档

db.集合名称.insert();

两重含义:

当我们执行insert()时,会去检查该集合名称是否存在:

如果存在,则会往该集合插入数据,

如果不存在,则会创建该集合并插入数据。

举例:

db.xx.insert({x:1});

查看xx集合下的数据:

db.xx.find();

show dbs;

 3.2 文档的操作

3.2.1 文档的插入

1 插入单个文档:

db.a.insert({x:1,y:2,z:3});

2 一次性的往集合里插入多个文档

多个文档以数组的方式插入:

数组:一组数据

数组的格式:[数据1,数据2,……数据n]

db.a.insert([

​ {name:'jack',age:19},

​ {name:"jim",age:20},

​ {name:"rose",age:18}

]);

3 当给同一个字段/键/属性赋多个值的时候,取最后一个值

db.a.insert({m:1,m:2,m:3});

4 允许重复插入两次相同的文档,因为系统每次给文档分配不同的_id,

不同的_id代表不同的文档。

db.a.insert({x:1});

5 允许用户自定义_id,但不可两次取值相同

db.a.insert({_id:2,x:1});

 3.2.2 文档的查询

文档查询基于以下数据,执行以下插入操作:

db.product.insert([ {item:"电影票",stocks:100,name:"芳华",price:50,director:"冯小刚",actor:["苗苗","黄轩"]}, {item:"电影票",stocks:87,name:"天下无贼",price:50,director:"冯小刚",actor:["刘德华","刘若英", "王宝强"]}, {item:"电影票",stocks:56,name:"猫妖传",price:60,director:"陈凯歌",actor:["黄轩","张雨绮","秦昊"]}, {item:"电影票",stocks:30,name:"英雄",price:40,director:"张艺谋",actor:["章子怡","张曼玉","梁朝伟"]}, {item:"电影票",stocks:92,name:"十面埋伏",price:20,director:"张艺谋",actor:["刘德华","章子怡","金城武"]}, {item:"音乐",stocks:75,name:"自传",artist:"五月天",price:20,tracks:["A","B","C"]}, {item:"图书",stocks:50,name:"苏菲的世界",price:45,author:"乔斯坦贾德"}, {item:"连衣裙",stocks:20,name:"mistry",price:280,size:{length:75,width:50,uom:"cm"}}, {item:"电脑",stocks:10,name:"联想10",price:3700,size:{length:15,width:15,uom:"in"}} ]);

 1 查找满足特定条件的文档

涉及到的操作符如下:

 

 示例1:查询导演是张艺谋的商品信息

db.product.find({director:"zhangyimou"});

db.product.find({director:{$eq:"zhangyimou"}});

示例2:查询除了英雄(名字)以外的商品信息

db.product.find({name:{$ne:"yingxiong"}});

示例3:查询价格高于280的商品信息

db.product.find({price:{$gt:280}});

 示例4:查询电影票和音乐专辑的商品信息

db.product.find({item:{$in:["ticket","music"]}});

 示例5:查询价格在40到280之间的商品信息(包含边界)

db.product.find({$and:[{price:{$gte:40}},{price:{$lte:280}}]});

db.product.find({price:{$gte:40,$lte:280}});

 示例6:查询导演是冯小刚的电影票信息

db.product.find({item:"ticket",director:"fengxiaogang"});

示例7:查询商品类型是电影票或者价格高于280的商品

db.product.find({$or:[{item:"ticket"},{price:{$gt:280}}]});

 2 内嵌文档的查询

示例1:查询商品尺寸满足长度为75,宽度为50,度量单位为cm的商品信息

db.product.find({size:{length:75,width:50,uom:'cm'}});

 不按内嵌文档录入时的顺序写就会查询不到:

db.product.find({size:{width:50,uom:'cm',length:75}});

 

示例2:查询商品尺寸单位是cm的商品信息

db.product.find({"size.uom":"cm"});

注意:涉及到内嵌文档里的字段的引用,通过“.”的方式来引用,

并且需要将这个字段放在引号里(“size.uom”)

 3 数组的查询

 数组里的元素是有编号的,编号从0开始,这就意味着,可以通过编号去取元素。可以通过“数组名.编号”的方式去取值。

举例:比如要取数组xx里面的第一个值,我们用:xx.0,取第二个值:xx.1……以此类推。

数组查询基于以下数据,执行以下插入操作:

db.inventory1.insert([

{item:"journal",qty:25,tags:["blank","red"],dim_cm:[14,21]},

{item:"notebook",qty:50,tags:["red","blank"],dim_cm:[14,21]},

{item:"paper",qty:100,tags:["red","blank"],dim_cm:[14,21]},

{item:"planner",qty:75,tags:["blank","red"],dim_cm:[22.85,30]},

{item:"postcard",qty:45,tags:["blue"],dim_cm:[10,15.25]}

]);

示例1:查询tags数组只包含red和blank,且red在前blank在后的商品信息

db.inventory1.find({tags:["red","blank"]});

示例2:查询tags数组包含了red和blank的商品信息

db.inventory1.find({tags:{$all:["blank","red"]}});

问题:db.inventory1.find({tags:{$in:["blank","red"]}});可以吗?

添加一组数据:

db.inventory1.insert({item:"X",qty:100,tags:["red"]});

小结:$all后面数组列的都要有,$in有其一就可以

示例3:匹配数组里的一个元素

找到tags数组里有red元素的记录

db.inventory1.find({tags:"red"});

示例4:找到dim_cm数组里包含至少一个元素的值大于25的记录

db.inventory1.find({dim_cm:{$gt:25}});

示例5:找到数组dim_cm中某个元素大于15且小于20

db.inventory1.find({dim_cm:{$elemMatch:{$gt:15,$lt:20}}});

示例6:找到数组dim_cm第二个元素的值大于25的记录 

 db.inventory1.find({"dim_cm.1":{$gt:25}});

 示例7:找到tags数组里包含1个元素的记录

db.inventory1.find({tags:{$size:1}});

ヾ(•ω•`)o这次就先到这里啦,期待下次新内容噢

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值