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.测试接口方法(也可以继续写业务逻辑接口,在测试接口方法)

相关推荐
floret*2 分钟前
在 hiveSQL 中判断一个字段是否包含某个值
前端·javascript·数据库
冰红茶兑滴水21 分钟前
MySQL 数据库之库操作
数据库·mysql
Fireworkitte1 小时前
MongoDB
数据库·mongodb
来一杯龙舌兰1 小时前
【MongoDB】MongoDB的聚合(Aggregate、Map Reduce)与管道(Pipline) 及索引详解(附详细案例)
数据库·mongodb·mapreduce·索引·aggregate·pipline
爱吃烤鸡翅的酸菜鱼3 小时前
MySQL初学之旅(1)配置与基础操作
java·数据库·mysql·database
三日看尽长安花5 小时前
【分布式数据库】
数据库·分布式
一 乐9 小时前
家常菜点餐|基于java和小程序的家庭大厨家常菜点餐系统设计与实现(源码+数据库+文档)
java·数据库·小程序·家庭点餐小程序·家庭家常菜点餐
小小不董9 小时前
Oracle OCP认证考试考点详解082系列08
linux·运维·服务器·数据库·oracle·dba
王哲晓10 小时前
第一章 微服务入门
java·数据库·微服务
DarkAthena10 小时前
【MogDB】MogDB5.2.0重磅发布第五篇-支持部分ORACLE的HINT
数据库·oracle·opengauss