MongoDB安装&基本操作
MongoDB是一种非关系型数据库,尽管如此,它在索引、分片策略或者是调用增删改查都和MySQL异曲同工。
接下来就进入MongoDB的学习内容。
1、业务应用场景
MongoDB旨在完成“三高需求”以及web2.0下的大数据时代,三高指的是如下:
-
对数据的高并发读写需求。
-
海量数据的高效率存储和访问的需求。
-
对数据库高可扩展性(能够修改表内容)和高可用性的需求。
其具体应用场景如下:
- 社交场景
- 游戏场景
- 物流场景(存储订单信息,订单会不断更新,以Mongo内嵌数组形式存储)
- 物联网场景
- 视频直播
数据操作方面共同特点在于:
- 数据量大
- 写入操作频繁
- 对事务性要求不高
什么时候可以使用MongoDB?
- 不需要事务或者join支持
- web或者软件的迭代开发
- 2000-3000以上的读写QPS
- 应用开发在TB级别甚至PB
- 应用需要高可用
- 大量的地理位置查询、文本查询
2、MongoDB简介
简单概括就是:开源、高性能、无模式(使用BSON,类似于JSON),是最像MySQL的Nosql。
上图就是根据MongoDB和关系型数据库之间的对比。比如MySQL用表来存储数据,在MongoDB使用的是Collection集合。
MongoDB特点
高性能、高可用、高并发、丰富的查询支持、无模式、灵活的文档结构。
3、MongoDB安装
windows下安装
1、首先点击官网上进行下载:https://www.mongodb.com/download-center/community
我这里下的是MongoDB 5.0.5。这里大可放心下载最新版就可以了。下载时选择cunstom可选择到自己想要下载的路径。后面直接next即可。(我这里默认安装图形化compass)
安装时,除非下载到有权限的文件夹下,否则一般而言都是没有问题的。
2、5.0.5是默认帮你配置好了data。我这儿并没有过多的进行配置,主要是以后会以linux为主进行架构和设计。
Compass使用连接
在下载5.0.5时顺便安装了Compass图形化工具。可见下图部分内容,这个可视化工具的界面还是很好看的。
现在使用Compass是非常方便的,直接连接即可出现下面的内容:
上面的三个数据库就是默认创建的内容。
Linux下安装(CentOS7)
还是点击https://www.mongodb.com/download-center/community,选择好tar并且在linux工具传输中选择好目录,传输解压。
配置好存储文件和配置文件的地方
#数据存储目录
mkdir -p /mongodb/single/data/db
#日志存储目录
mkdir -p /mongodb/single/log
而后进行配置配置文件,启动服务如下内容:
在这里插入图片描述
查看端口映射检查是否启动成功:netstat -nltp|grep mongod
能够查看到mongodb即可大功告成。
连接linux与compass
打开compass,先点击右上角的链接,直至跟下图所展示的内容一致,后面的内容就是怎么连接远程linux虚拟机映射。
自此就可以完成了。
4、创建MongoDB数据库
4.1 数据库操作
启动数据库
首先在linux启动mongodb,其次在windows下输入:
D:\MongoDB\bin>mongo --host=你的远程服务器ip
MongoDB存储机制:内存和磁盘
当你创建一个数据库时,数据库暂时会存储到内存中。当你show时,依然会只出现以往的数据库。
在你创建好数据库后,默认有以下三个数据库:
-
admin:权限
-
local:集群策略,这个数据下不会被复制
-
config:用于分片设置时在内部使用以方便保存分片信息。
数据库创建
use 数据库名称
在数据库不存在时,默认会自动创建一个数据库。
数据库删除
数据库名称.dropDatabase()
数据库查看
查看有权限查看的所有的数据库命令
show dbs
or
show databases
查看正在使用的数据库数据库
db
MongoDB 中默认的数据库为 test,如果你没有选择数据库,集合将存放在 test 数据库中。
另外: 数据库名可以是满足以下条件的任意UTF-8字符串。
- 不能是空字符串("")。
- 不得含有’ '(空格)、.、$、/、\和\0 (空字符)。
- 应全部小写。
- 最多64字节。
4.2 集合操作
创建一个集合(显式创建):
db.createCollection("my")
show collections
删除一个集合:
db.my.drop()
show collections
如果成功删除选定集合,则返回方法为true,否则为false。
隐式创建:如果一个集合不存在并且直接调用CRUD,则会默认的创建该集合。
4.3 文档的CRUD
插入
db.collection.insert(
<document or array of documents>,
{
writeConcern: <document>,
ordered: <boolean>
}
)
- document:选择要插入的集合
- ordered:可选项,如果是真的就按顺序插入文档
- writeConcern:document格式,用来插入一个document内容。
注意:
-
文档中的键/值对是有序的。
-
文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
-
MongoDB区分类型和大小写。
-
MongoDB的文档不能有重复的键。
-
文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
文档键命名规范:
- 键不能含有\0 (空字符)。这个字符用来表示键的结尾。
- .和$有特别的意义,只有在特定环境下才能使用。
- 以下划线"_"开头的键是保留的(不是严格要求的)。
批量插入
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
同样的:
- document:要插入集合的文档或者文档数组
- …
查询
db.collection.find(<query>, [projection])
query:可选项,使用查询运算符指定选择筛选器。若要返回集合中的所有文档,请省略此参数或传递空文档 ( {} )。
projection:可选项指定要在与查询筛选器匹配的文档中返回的字段(投影)。若要返回匹配文档中的所有字段, 请省略此参数。
比如如下小例子:
>db.comment.find({userid:"1003"},{userid:1,nickname:1})
{ "_id" : "4", "userid" : "1003", "nickname" : "凯撒" }
{ "_id" : "5", "userid" : "1003", "nickname" : "凯撒" }
文档更新
b.collection.update(query, update, options)
//或
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string> // Available starting in MongoDB 4.2
}
)
(1)覆盖的修改 如果我们想修改_id为1的记录,点赞量为1001,输入以下语句:
db.comment.update({_id:"1"},{likenum:NumberInt(1001)})
执行后,我们会发现,这条文档除了likenum字段其它字段都不见了,
(2)局部修改
_为了解决这个问题,我们需要使用修改器$set来实现,命令如下: 我们想修改_id为2的记录,浏览量为889,
输入以下语句:
db.comment.update({_id:"2"},{$set:{likenum:NumberInt(889)}})
这样就OK啦。
(3)批量的修改
更新所有用户为 1003 的用户的昵称为 凯撒大帝 。
//默认只修改第一条数据
db.comment.update({userid:"1003"},{$set:{nickname:"凯撒2"}})
//修改所有符合条件的数据
db.comment.update({userid:"1003"},{$set:{nickname:"凯撒大帝"}},{multi:true})
提示:如果不加后面的参数,则只更新符合条件的第一条记录
(4)列值增长的修改
如果我们想实现对某列值在原有值的基础上进行增加或减少,可以使用 $inc 运算符来实现。
需求:对3号数据的点赞数,每次递增1
db.comment.update({_id:"3"},{$inc:{likenum:NumberInt(1)}})
删除文档
删除文档的语法结构:
db.集合名称.remove(条件)
以下语句可以将数据全部删除,请慎用
db.comment.remove({})
如果删除_id=1的记录,输入以下语句
db.comment.remove({_id:"1"})
4.4 文档分页查询
统计查询
统计查询所使用的是count()方法,语法如下:
db.collection.count(query,options)
- query,即document类型。查询选择条件。
- options,document类型。可选,用于修改计数的额外选项。
比如如下例子
(1)统计comment集合的所有的记录数:
db.comment.count()
(2)统计userid为1003的记录条数
db.comment.count({userid:"1003"})
默认情况下 count() 方法返回符合条件的全部记录条数。
分页列表查询
可以使用limit()方法来读取指定数量的数据,使用skip()方法来跳过指定数量的数据。
>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
如果你想返回指定条数的记录,可以在find方法后调用limit来返回结果(TopN),默认值20,例如:
db.comment.find().limit(3)
skip方法同样接受一个数字参数作为跳过的记录条数。(前N个不要),默认值是0
db.comment.find().skip(3)
排序查询
sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用 于降序排列。
db.COLLECTION_NAME.find().sort({KEY:1})
或
db.集合名称.find().sort(排序方式)
比如:对userid降序排列,并对访问量进行升序排列
db.comment.find().sort({userid:-1,likenum:1})
在skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit(),和命令编写顺序无关。
更多查询
正则查询
db.collection.find({field:/正则表达式/})
或
db.集合.find({字段:/正则表达式/})
比较查询(使用 g t 、 gt、 gt、lt、 g t e 、 gte、 gte、lte、$ne)
db.集合名称.find({ "field" : { $gt: value }}) // 大于: field > value
db.集合名称.find({ "field" : { $lt: value }}) // 小于: field < value
db.集合名称.find({ "field" : { $gte: value }}) // 大于等于: field >= value
db.集合名称.find({ "field" : { $lte: value }}) // 小于等于: field <= value
db.集合名称.find({ "field" : { $ne: value }}) // 不等于: field != value
包含查询(包含使用$in操作符)
查询评论的集合中userid字段包含1003或1004的文档:
db.comment.find({userid:{$in:["1003","1004"]}})
条件连接查询:
我们如果需要查询同时满足两个以上条件,需要使用$and操作符将条件进行关联。(相当于SQL的and)。
格式:$and:[ { },{ },{ } ]
示例:查询评论集合中likenum大于等于700 并且小于2000的文档:
db.comment.find({$and:[{likenum:{$gte:NumberInt(700)}},{likenum:{$lt:NumberInt(2000)}}]})
如果两个以上条件之间是或者的关系,我们使用 操作符进行关联,与前面and的使用方式相同。
格式:$or:[ { },{ },{ } ]
示例:查询评论集合中userid为1003,或者点赞数小于1000的文档记录
db.comment.find({$or:[ {userid:"1003"} ,{likenum:{$lt:1000} }]})
5、索引
索引支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
索引是特殊的数据结构,它以易于遍历的形式存储集合数据集的一小部分。索引存储特定字段或一组字段的值,按字段值排序。索引项的排序支持有效的相等匹配和基于范围的查询操作。此外,MongoDB还可以使用索引中的排序返回排序结果。
5.1 索引的类型
单字段索引
在文档的单个字段上创建用户定义的升序/降序索引,称为单字段索引。
复合索引
复合索引即多字段索引。
例如,如果复合索引由 { userid: 1, score: -1 } 组成,则索引首先按userid正序排序,然后在每个userid的值内,再在按score倒序排序。简单概括就是多重for循环。
其他索引
地理空间索引:为了支持对地理空间坐标数据的有效查询,MongoDB提供了两种特殊的索引:返回结果时使用平面几何的二维索引和返回结果时使用球面几何的二维球面索引。
文本索引: MongoDB提供了一种文本索引类型,支持在集合中搜索字符串内容。这些文本索引不存储特定于语言的停止词(例如“the”、“a”、“or”), 而将集合中的词作为词干,只存储根词。
哈希索引:为了支持基于散列的分片,MongoDB提供了散列索引类型,它对字段值的散列进行索引。这些索引在其范围内的值分布更加随机,但只支持相等匹配,不支持基于范围的查询。
5.2 索引管理操作
索引查看
说明: 返回一个集合中的所有索引的数组。
db.collection.getIndexes()
比如查看集合中所有的索引情况:
> db.comment.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "articledb.comment"
}
]
首先是默认_id索引,即在 _id
字段上创建一个唯一的索引,默认名字为 _id_
,该索引可防止客户端插入两个具有相同值的文 档,您不能在_id
字段上删除此索引。
该索引是唯一索引,因此值不能重复,即 _id 值不能重复的。在分片集群中,通常使用 _id 作为片键。
创建索引
说明: 在集合上创建索引。 语法:
db.collection.createIndex(keys, options)
移除索引
说明:可以移除指定的索引,或移除所有索引
1、指定索引的移除
db.collection.dropIndex(index)
2、所有索引的移除
db.collection.dropIndexes()
以上内容就是这一篇内容的分享。谢谢大家!