MongoDB简介

一.MongoDB相关概念

1.1.简介

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

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

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

1.2.体系结构

MYSQL和MongDB对比

SQL术语/概念MongDB术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
table  joins表连接,MongDBb不支持
嵌入文档MongoDB通过嵌入式文档来代替多表连接
primary  keyprimary  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跳过几条数据

ParameterTypeDescription
querydocument查询选择条件
optionsdocument可选。用于修改计数的额外选项

投影查询

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值