MongoDB 分布式文件存储数据库 详解

1、MongoDB概述

1.1、MongoDB简介

MongoDB是一个开源、高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的-一种。是最像关系型数据库(MySQL) 的非关系型数据库。

它支持的数据结构非常松散,是一种类似于JSON的格式叫BSON,所以它既可以存储比较复杂的数据类型,又相当的灵活。MongoDB中的记录是一个文档,它是一个由字段和值对(field:value) 组成的数据结构。MongoDB文档类似于JSON对象,即一个文档认为就是一个对象。字段的数据类型是字符型,它的值除了使用基本的一些类型外,还可以包括其他文档、普通数组和文档数组。

1.2、MongoDB的特点

  • 面向集合存储,容易存储对象类型的数据
  • 支持查询以及动态查询
  • 支持Ruby、Java、python、C++、PHP、C#等多种语言
  • 文件存储格式为BSON
  • 支持复制和故障恢复和分片

2、MongoDB的安装

2.1、Windows下安装

先进入官网进行下载安装包: https://www.mongodb.com/try/download/community
选择版本、操作系统、文件格式,单击download就会进行下载。

在这里插入图片描述
下载zip文件之后进行解压,解压之后就可以使用了,在bin同级目录下新建一个data文件夹,在data文件夹下再创建一个db文件夹,用于存放数据。

启动服务(直接启动)

进入bin目录下,打开cmd窗口,在这里使用命令进行启动: mongod --dbpath=..\data\db

在这里插入图片描述
运行之后进行访问27017端口号: http://localhost:27017/

在这里插入图片描述
使用配置文件进行启动

在bin同级目录下新建一个conf文件夹,用于存放配置文件,在这个文件夹下新建一个mongod.conf文件,在文件当中添加代码段:就是上面配置了的dbpath的绝对路径:

dbpath=F:\学习课程\Java系列\MongoDB\work\mongodb-win32-x86_64-windows-4.4.1\data\db

使用命令进行启动服务:mongod -f ..\conf\mongod.conf

在这里插入图片描述
服务启动之后,同样的访问27017端口进行检验

使用shell进行连接

在bin目录下进入cmd,直接使用mongo命令进行连接

在这里插入图片描述

第二种方法就是:添加端口进行连接:使用命令: mongo --host=localhost --port=27017

在这里插入图片描述

使用图形化工具进行连接 Compass

在这里提供了一个图形化工具conpass,同样的在官网进行下载:选择版本等。https://www.mongodb.com/try/download/compass

在这里插入图片描述
下载完成之后直接进行解压缩,双击exe文件运行即可。在下面可以看到原本的三个数据库各相关信息都会进行展示出来。

在这里插入图片描述
2.2、Linux下安装

和windows下安装一致,下载对应linux版本的文件,上传到Linux上,对gz文件进行解压。解压之后进行指定配置。首先在bin统计目录下创建一个data和log文件夹,用来存放数据和日志文件,之后直接进行启动mongodb

./mongod --port=27017 --dbpath=../data --logpath=../log/mongo.log

./mongo --port=27017

3、MongoDB 操作指令

3.1、库相关操作

3.1.1、数据库的创建和切换
创建库和切换库都是用的是use,在这里进行创建数据库之后,再进行show dbs 查看数据库,会发现articledb这个数据库并没有出现,在这里因为存储机制的关系,这个数据库还只存在内存当中,当这个数据库当中有一个集合的时候就会持久化磁盘当中,那个时候这个数据库才可以看到这个数据库。

show databases
use student

查看当前数据库。使用db命令即可查看。

3.1.2、数据库的删除
使用的是一个方法,db代表当前数据库

db.dropDatabase()

3.2、集合操作

3.2.1、集合创建
集合相当于关系数据库当中的表,使用createCollection()方法进行创建。

db.createCollection("log")

使用show collections 即可查看当前库有多少条集合。

3.2.2、隐式创建
当向一个集合中插入一个文档的时候,如果集合不存在,则会自动创建集合。

db.collection.insert(
<document or array of documents>,
	{
		writeConcern: <document>,
		ordered: <boolean>
	}
)

参数解析:

ParameterTypeDescription
documentdocument or array要插入到集合中的文档或文档数组。(json格式)
writeConcerndocument插入的性能的级别等
orderedboolean可选。如果为真,则按顺序插入数组中的文档,如果其中一个文档出现错误,MongoDB将返回而不处理数组中的其余文档。如果为假,则执行无序插入,如果其中-个文档出现错误,则继续处理数组中的主文档。在版本2.6+中默认为true

进行测试,使用insert进行插入数据

db.col.insert({title:"mongodb",description:"this is database",likes:100})

使用find()方法进行查询结果

在这里不单单是可以插入一条数据,也可以插入多条数据,使用insertMany()方法

db.col_many.insertMany([
	{title:"mongodb",description:"this is database",likes:100},	
	{title:"mongodb",description:"this is database",likes:100},
	{title:"mongodb",description:"this is database",likes:100}
	])

3.2.3、集合删除
db + 集合名 + drop方法进行删除,在删除之后再进行查看集合。

 db.log.drop()

3.2.4、集合查询
使用到一个find方法,在这个find方法当中也可以带参数进行查询,比如在前面创建的col_many集合当中查询

db.col_many.find({title:"mongodb"})
db.col_many.find({title:"mongodb1"})

这里还有一个fingOne()方法,只会返回一条数据

db.col_many.findOne({title:"mongodb"})

3.2.5、投影查询
在关系数据库当中就相当于子查询某几个字段,只需要再后面加上参数,参数也是json的数据类型,

db.col_many.find({title:"mongodb"},{title:1})
db.col_many.find({title:"mongodb"},{title:1,_id:0})

_id是会默认显示的,给后面加上_id:0就可以将其隐藏

3.2.6、数据更新
覆盖的修改,修改之后全部都会进行覆盖。

db.col.update({"title":"mongodb"},{"likes":101})

局部修改,为了解决这个问题,我们需要使用修改器$set来实现,命令如下:

db.col.update({"title":"mongodb1"},{$set:{"likes":101}})

批量修改:使用到一个新的参数 {multi:true}

3.2.7、数据删除
使用remove进行删除,remove当中可以添加参数 db.col.remove({"title":"mongodb1"}) 删除title为mongodb1的这一条数据。在这里 db.col.remove({}) 就表示删除所有数据。

3.2.8、统计查询
统计查询用到count()方法进行求和:在count方法当中还可以添加json对象进行选择。

> db.col.count()
> db.col.count({"title":"mongodb"})

3.2.9、分页查询
在find之后我们可以加上limit,表示查询数据的前几条;

db.col.find().limit(2)

skip方法同样接受一个数字参数作为跳过的记录条数。(前N个不要) ,,默认值是0

db.col.find().limit(2).skip(1)

在这里进行查询,跳过第一条数据。

3.2.10、排序查询
排序查询使用的是sort方法,sort方法当中添加的也是json格式的数据,一个是列,后面的参数 1表示升序,0表示降序

db.col.find().sort({"likes":1})

3.2.11、模糊查询
模糊查询使用正则表达式进行查询,这里的正则使用的是双斜杠。

db.col.find({"description":/this/})

3.2.12、比较查询
查询集合当中某一条数据大于或者小于某一个数值,如下表示likes的值大于100

db.col.find({"likes":{$gt:NumberInt(100)}})

其他的参数见下表,使用方法一致:

参数含义
gt大于
lt小于
gte大于等于
lte小于等于
ne不等于

3.2.13、包含查询
包含查询使用到 $in 操作符,如下代码所示;查询likes的值是100和101的值

db.col.find({"likes":{$in:[100,101]}})

3.2.14、条件连接查询
我们如果需要查询同时满足两个以上条件,需要使用$and操作符将条件进行关联。(相当于SQL的and),查询likes的值在110到300之间的值,代码如下:

 db.col.find({$and:[{"likes":{$gte:110}},{"likes":{$lt:300}}]})

除了and还有or查询,or的使用和and是一致的。

 db.col.find({$or:[{"likes":{$gte:150}},{"likes":{$lt:90}}]})

4、MongoDB 索引

4.1、索引概述

索引支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。如果查询存在适当的索引,MongoDB可以使用该索引限制必须检查的文档数。索引是特殊的数据结构,它以易于遍历的形式存储集合数据集的- -小部分。索引存储特定字段或-组字段的值,按字段值排序。索引项的排序支持有效的相等匹配和基于范围的查询操作。此外,MongoDB还可以使用索引中的排序返回排序结果。

官方文档 :https://docs.mongodb.com/manual/tutorial/getting-started/

MongoDB索引使用B树数据结构(确切的说是B-Tree, MySQL是B+Tree)

4.2、索引的类型

1、单字段索引
MongoDB支持在文档的单个字段上创建用户定义的升序/降序索引,称为单字段索引(Single Field Index)。

对于单个字段索引和排序操作,索引键的排序顺序(即升序或降序)并不重要,因为MongoDB可以在任何方向上遍历索引。

2、复合索引
MongoDB还支持多个字段的用户定义索引,即复合索引(Compound Index)。

复合索引中列出的字段顺序具有重要意义。例如,如果复合索引由{ userid: 1, score: -1 }組成,则索引首先按userid正序排序,然后在每个userd的值内,再在按score倒序排序。

3、其他索引

地理空间索引(GeospatialIndex)、文本索引(Text Indexes)、哈希索引(Hashed Indexes)。

  • 地理空间索引(Geospatial Index):为了支持对地理空间坐标数据的有效查询,MongoDB提供 了两种特殊的索引:返回结果时使用平面几何的二维索引和返回结果时使用球面几何的二维球面索引。
  • 文本索引(Text Indexes) :MongoDB提供了-种文本索引类型,支持在集合中搜索字符串内容。这些文本索引不存储特定于语言的停止词 (例如 “the”、“a”. “or”) ,而将集合中的词作为词干,只存储根词。
  • 哈希索引(Hashed Indexes) :为了支持基于散列的分片,MongoDB提供了散列索引类型,它对字段值的散列进行索引。这些索引在其范围内的值分布更加随机,但只支持相等匹配,不支持基于范围的查询。

4.3、索引的操作

4.3.1、查询索引
使用到一个 getIndexes() 方法进行获取所有索引:

db.col.getIndexes()

4.3.2、索引创建

使用一个 createIndex(keys,options) 方法进行创建索引,不给定参数都将使用默认参数。在集合当中再添加一个对象即可创建复合索引。

4.3.3、索引的移除

可以移除指定的索引,或移除所有索引,指定索引的移除,使用dropIndex进行移除。

db.col.dropIndex({"likes":1})
或者直接传递索引的name进行删除
db.col.dropIndex("likes_1")

所有索引的删除,使用 dropIndexs() 方法删除即可。

4.4、索引的使用

4.4.1、执行计划
分析查询性能(Analyze Query Performance)通常使用执行计划(解释计划、Explain Plan)来查看查询的情况,如查询耗费的时间、是否基于索引查询等。那么,通常,我们想知道,建立的索引是否有效,效果如何,都需要通过执行计划查看。
语法

db.collection.find(query ,options).explain(options)

在这里,explain没有加参数还是会默认进行全局扫描,添加索引之后,可以发现是抓取,而不是进行全局扫描

4.4.2、涵盖的查询 Covered Queries
当查询条件和查询的投影仅包含索引字段时,MongoDB直接从索引返回结果,而不扫描任何文档或将文档带入内存。这些覆盖的查询可以非常有效。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Modify_QmQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值