MongoDB简介

一.MongoDB相关概念

1.1.简介

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

它支持的数据结构非常松散,是一种类似于json的格式叫BSON,所以它既可以储存比较复杂的数据类型,又相当灵活

MongoDB中的记录是一个文档,它是一个由字段和值对(field:value)组成的数据结构。MongoDB文档类似于jSON对象,即一个文档认为就是一个对象。字段的数据类型是字符型,他的值除了使用基本的一些类型外,还可以包括其他文档,普通数组和文档数组。

1.2.体系结构

MYSQL和MongDB对比

SQL术语/概念 MongDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接,MongDBb不支持
嵌入文档 MongoDB通过嵌入式文档来代替多表连接
primary key primary key 主键,MongoDB自动将_id字段设置为主键

1.3数据模型

二.基本常用命令

2.1.启动MongoDB数据库

1.在bin目录中打开命令提示符,输入如下命令:

mongod --dbpath=..\data\db

2.配置文件启动服务

客户端连接MongoDB

1.到MongoDB官网下载MongoDB Compass并连接

2.在navicat中连接MongoDB

2.2默认保留的数据库

·admin: 从权限角度考虑,这是root数据库,如果将一个用户添加到这个数据库,这个用户自动继承所以数据库的权限,一些特定的服务端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器

**·local:**数据永远不会被复制,可以用来储存于本地的单台服务器的集合(部署集群,分片等)

**·config:**Mongo用于分片设置时,config数据库在内部使用,用来保存分片的相关信息

show dbs

use articledb

db

当使用use articledb 的时候,articledb其实存放在内存中,只有数据库存一个集合collection之后,mongodb才会将这个数据库持久化到硬盘中。

2.3基本的CRUD

2.3.1创建文档

使用insert()或者save()方法向集合中插入文档,语法如下:

db.collection.insert({

"a":" ",

"b":1

})

使用insertMany()方法进行批量插入

db.collection.insertMany([

{<document 1>},

{<document 2>}

])

2.3.2删除文档

删除文档的语法结构:

db.集合名称.remove(条件)

以下语句可以将数据全部删除

db.comment.remove({})

例如:

db.comment.remove({_id:"1"})

2.3.3修改文档

(1)覆盖的修改

如果我们想修改_id为1的记录,点赞量为1001,输入以下语句:

数据库注释.update({_id:"1"},{ikenum: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:"凯撒大帝"}},{mult:true})

提示:如果不加后面的参数,则只更新符合条件的第一条记录

2.3.4查找文档

查询所有

db.comment.find()或db.comment.find({})

每条文档会有一个_id的字段,相当于关系数据库中表的主键,当你插入文档记录时没有指定

该字段,MongoDB会自动创建,类型为ObjectID类型

查询单个

db.comment.find({ userid:' 1 '})

db.comment.findOne({ userid:' 1 ' }) (只查找符合条件的第一条)

排序查询

db.collection.find().sort({KEY:1})

或db.集合名称.find().sort(排序方式)

例:db.comment.find().sort({userid:-1 , likenum:1}) (1为升序排列,2为降序排列)

skip(),limilt(),sort()三个放在一起执行的时候,执行的顺序是先sort(),然后skip(),最后是显示的limit(),和命令编写顺序无关。

分页查询

db.collection.count(query,options)

db.collection.find().limit(number).skip(number)---------limit返回几条数据,skip跳过几条数据

Parameter Type Description
query document 查询选择条件
options document 可选。用于修改计数的额外选项

投影查询

db.comment.find({userid:"1002"},{userid:1,nickname:1})

查询结果只显示_id,userid,nickname,如若不想现实_id, 将_id:0加入

正则的复杂条件查询

db.collection.find({ field:/正则表达式/})

db.集合.find({字段:/正则表达式/})

db.comment.find({content:/开水/}) 查询评论内容包含"开水"的所有文档

db.comment.find({content:/^专家/}) 查询评论内容的以"开水"开头的文档

比较查询

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

如:db.comment.find({ likenum:{ $gt :NumberInt(700)}})

包含查询

示例:查询评论的集合中userid字段包含1003或1004的文档

db.comment.find({userid: { $in : ["1003","1004"]}})

如若查询评论集合中userid字段不包含1003和1004的文档,只需将 in 换成 nin

条件连接查询

$and : [{ } , { } , { }]

示例:查询评论集合中likenum大于等于700且小于2000的文档:

db.commnet.find( { $and : [ { likenum:{ gte : NumberInt(700) } } , {likenum:{lt : NumberInt(2000) } } ] } )

如果两个条件以上是或者关系,使用方式与and一样,把 and 换为 or

三.索引

3.1概述

索引支持在 MongoDB 中高效地执行查询.如果没有索引, MongoDB 必须执行全集合扫描, 即扫描集合中的每个文档, 以选择与查询语句 匹配的文档.这种扫描全集合的查询效率是非常低的, 特别在处理大量的数据时, 查询可以要花费几十秒甚至几分钟, 这对网站的性能是非常致命的.

如果查询存在适当的索引, MongoDB 可以使用该索引限制必须检查的文档数.

索引是特殊的数据结构, 它以易于遍历的形式存储集合数据集的一小部分.索引存储特定字段或一组字段的值, 按字段值排序.索引项的排 序支持有效的相等匹配和基于范围的查询操作.此外, MongoDB 还可以使用索引中的排序返回排序结果.

MongoDB 使用的是 B Tree, MySQL 使用的是 B+ Tree

3.2索引的类型

单字段索引

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

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

复合索引

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

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

其他索引

地理空间索引 Geospatial Index

文本索引 Text Indexes

哈希索引 Hashed Indexes

3.3索引管理操作

索引的查看

db.collection.getIndexes()

默认 _id 索引: MongoDB 在创建集合的过程中, 在 _id 字段上创建一个唯一的索引, 默认名字为 _id , 该索引可防止客户端插入两个具有相同值的文 档, 不能在 _id 字段上删除此索引.

注意:该索引是唯一索引, 因此值不能重复, 即 _id 值不能重复的.

在分片集群中, 通常使用 _id 作为片键.

索引的创建

db.collection.createIndex(keys, options)

options(更多选项)列表

注意在 3.0.0 版本前创建索引方法为 db.collection.ensureIndex() , 之后的版本使用了 db.collection.createIndex() 方法, ensureIndex() 还能用, 但只是 createIndex() 的别名.

举个🌰

$ db.comment.createIndex({userid:1})

{

"createdCollectionAutomatically" : false,

"numIndexesBefore" : 1,

"numIndexesAfter" : 2,

"ok" : 1

}

$ db.comment.createIndex({userid:1,nickname:-1})

...

索引的删除

删除某一个索引

$ db.collection.dropIndex(index)

删除全部索引

$ db.collection.dropIndexes()

_id 的字段的索引是无法删除的, 只能删除非 _id 字段的索引

示例

删除 comment 集合中 userid 字段上的升序索引

$ db.comment.dropIndex({userid:1})

3.4 索引的使用

执行计划

分析查询性能 (Analyze Query Performance) 通常使用执行计划 (解释计划 - Explain Plan) 来查看查询的情况

$ db.<collection_name>.find( query, options ).explain(options)

比如: 查看根据 user_id 查询数据的情况

未添加索引之前

"stage" : "COLLSCAN", 表示全集合扫描

添加索引之后

"stage" : "IXSCAN", 基于索引的扫描

四.SpringBoot整合MongoDB

1.导入依赖坐标

2.在yml配置MongoDB

3.实体类

复制代码
@Data//lombok
@Document("comment")//可以省略,如果省略,默认使用类名小写映射集合
public class Comment {
//@Id 该属性的值会自动对应mongodb的主键字段"_id",如果属性名为id可省略
    private Integer id;
//@Field("content")//该属性对应mongodb字段的名字,如果一致,则无需该注解
    private String name;
    private String age;
}

4.数据访问接口

5.测试接口方法(也可以继续写业务逻辑接口,在测试接口方法)

相关推荐
tatasix42 分钟前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。1 小时前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了1 小时前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度1 小时前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮1 小时前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9992 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️2 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98763 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
苏-言3 小时前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring
Ljw...3 小时前
索引(MySQL)
数据库·mysql·索引