MongoDB之完整入门知识(集合操作、文档基本CRUD操作、文档分页查询、索引等相关命令)

news2024/10/7 18:26:35

MongoDB完整入门知识

  • 一、相关概念
    • 1、简介
    • 2、体系结构
    • 3、安装网址
  • 二、MongoDB基本常用命令
    • 1、Shell连接(mongo命令)
    • 2、选择和创建数据库
      • 2.1 选择和创建数据库的语法格式(如果数据库不存在,则自动创建)
      • 2.2 查看有权限查看所有数据库的命令
      • 2.3 查看当前正在使用的数据库命令
      • 2.4 三个初始数据库作用
        • (1)admin库
        • (2)local库
        • (3)config
      • 2.5 数据库的删除(主要用来删除已经持久化的数据库)
    • 3、集合操作
      • 3.1 集合的显式创建
      • 3.2 集合的隐式创建
      • 3.3 查看数据库中的集合(表)
      • 3.4 集合的删除
    • 4、文档的基本CRUD操作
      • 4.1 文档的插入
        • (1)单个文档的插入
        • (2)批量插入
        • (3)文档插入使用try catch
      • 4.2 文档的查询
        • (1)查询所有
        • (2)按条件查询
        • (3)返回符合条件的第一条数据(最多只返回一条)
        • (4)投影查询
      • 4.3 文档的更新
        • (1)更新文档的语法
        • (2)覆盖修改(将该条记录完全覆盖)
        • (3)局部修改(使用修改器$set来实现,默认只修改第一条数据)
        • (4)批量修改(更新所有用户为100的数据)
        • (5)列值增长的修改
      • 4.4 删除文档
        • (1)删除文档的语法
        • (2)删除所有数据
        • (3)删除_id = 1的记录
    • 5、文档的分页查询
      • 5.1 统计查询
        • (1)统计comment集合的所有的记录数
        • (2)按条件统计记录数
      • 5.2 分页列表查询
        • (1)基础语法
        • (2)limit方法(返回前n条数据)
        • (3)skip方法(跳过前n条数据)
        • (4)分页样例
      • 5.3 排序查询
        • (1)基础语法
        • (2)样例
      • 5.4 注意
    • 6、其它查询方式
      • 6.1 正则复杂条件查询
        • (1)基础语法
        • (2)样例
      • 6.2 比较查询
        • (1)基础语法
        • (2)样例
      • 6.3 包含查询
        • (1)基础语法及样例
      • 6.4 条件连接查询
        • (1)基础语法及样例
  • 三、索引-Index
    • 1、概述
    • 2、单字段索引
    • 3、复合索引
    • 4、索引的管理操作
      • 4.1 索引的查看
        • (1)说明
        • (2)语法
      • 4.2 索引的创建
        • (1)说明
        • (2)语法
        • (3)单字段索引
        • (4)复合索引
      • 4.3 索引的移除
        • (1)说明
        • (2)指定索引的移除
        • (3)所有索引的移除
      • 4.4 相关计划
        • (1)执行计划
        • (2)涵盖的查询

一、相关概念

1、简介

Mongo DB是一个开源的、高性能、无模式的文档型NoSQL数据库,能够很好地应对数据库高并发的读写需求、海量数据的高效率存储和访问的需求以及数据库的高扩展性和高可用性的需求。同时对Web2.0的网站也能从容面对。
它支持的数据结构非常松散,是一种类似于JSON的格式叫BSON,所以它既可以存储比较复杂的数据类型,又相当的灵活
MongoDB中的记录是一个文档,它是一个由字段和值对组成的数据结构。MongoDB文档类似于JSON对象,即一个文档认为就是一个对象。字段和数据类型是字符型,它的值除了使用基本的一些类型外,还可以包括其他文档、普通数组和文档数组。

2、体系结构

MongoDB 非关系型数据库(Database)----->Collection(集合)----->Document(文档)
MySQL 关系型数据库(Database)----->Table(数据库表)------->Row(数据记录行)

3、安装网址

MongoDB网址跳转
一般首先安装MongoDB Community Server 版本5.x的zip包就可以了,最新版本可能会出问题
在这里插入图片描述

之后安装MongoDB Compass软件用来连接MongoDB就可以了。
在这里插入图片描述

二、MongoDB基本常用命令

1、Shell连接(mongo命令)

如果不用Mongo Compass连接MongoDB的话,在命令提示符输入相关shell命令即可完成登录。

mongo

在这里插入图片描述

2、选择和创建数据库

2.1 选择和创建数据库的语法格式(如果数据库不存在,则自动创建)

use 数据库名称

2.2 查看有权限查看所有数据库的命令

show dbs
或者
show databases

注意:在MongoDB中,集合只有在内容插入后才会创建,也就是说创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
未添加内容时,暂存在内存里,添加内容后,则自动存到磁盘里

2.3 查看当前正在使用的数据库命令

db

MongoDB中默认的数据库是test,如果没有选择数据库,集合将存放在test数据库中。

2.4 三个初始数据库作用

(1)admin库

从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,则这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能在这个数据库运行,比如列出所有的数据库或者关闭服务器。

(2)local库

这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合。

(3)config

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

2.5 数据库的删除(主要用来删除已经持久化的数据库)

db.dropDatabase()

3、集合操作

集合,类似于关系型数据库中的表

3.1 集合的显式创建

name:要创建的集合名称

db.createCollection(name)

例子
创建一个名为mycollection的普通集合

db.createCollection("mycollection")

3.2 集合的隐式创建

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

3.3 查看数据库中的集合(表)

show collections
或者
show tables

3.4 集合的删除

db.collection.drop()
或者
db.集合.drop()

删除成功,则drop()方法返回true,否则返回false
例子

db.mycollection.drop()

4、文档的基本CRUD操作

文档的数据结构和JSON基本一样,所有存储在集合中的数据都是BSON格式。

4.1 文档的插入

(1)单个文档的插入

使用insert( )或者save( )方法向集合中插入文档。

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

测试数据,向comment的集合中插入一条测试数据

db.comment.insert({"articleod":"10000","content":"今天天气真好","userid":"1001","createdatetime":new Date(),"state":null})

提示:
如果comment集合不存在,则会隐式创建。
mongo中的数字,默认情况下是double类型,如果要存整型,必须使用函数NumberInt(整型数字)。
插入当前日期使用new Date( )。
插入的数据没有指定_id,会自动生成主键值。
如果某字段没值,可以赋值为null,或不写该字段。
结果如下
在这里插入图片描述

(2)批量插入

使用insertMany()方法向集合中插入文档。

db.collection.insert(
    [<document1> , <document1>],
    {
        writeConcern: <document>,
        ordered: <boolean>
    }
)

提示:
插入时指定了_id,则主键就是该值
如果某条数据插入失败,将会终止插入,但已经插入成功的数据不会回滚掉。
因为批量插入由于数据较多容易失败,因此可以使用try catch进行异常捕获处理,测试的时候可以不处理。

db.comment.insertMany([
  {"_id":"1","articleId":"1001", "content":"吃饭喝水"},
  {"_id":"2","articleId":"1001", "content":"吃饭喝水"},
  {"_id":"3","articleId":"1001", "content":"吃饭喝水"},
])

(3)文档插入使用try catch

try{
   db.comment.insertMany([
  {"_id":"1","articleId":"1001", "content":"吃饭喝水"},
  {"_id":"2","articleId":"1001", "content":"吃饭喝水"},
  {"_id":"3","articleId":"1001", "content":"吃饭喝水"},
]);
} catch(e){
   print(e);
}

4.2 文档的查询

(1)查询所有

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

db.comment.find()

(2)按条件查询

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

按照userId为1来查询数据

(3)返回符合条件的第一条数据(最多只返回一条)

db.comment.findOne({userId:'1'})

(4)投影查询

如果要查询结果返回部分字段,则需要使用投影查询(不显示所有字段,只显示指定的字段)
显示userId、name、_id字段

db.comment.find({userId:"1"}.{userId:1, name:1, _id:1})

显示userId、name字段,不显示_id字段

db.comment.find({userId:"1"}.{userId:1, name:1, _id:0})

查询所有数据,只显示_id、userId、name

db.comment.find({}.{userId:1, name:1, _id:1})

4.3 文档的更新

(1)更新文档的语法

db.collection.update(query, update, options)

query:查询选择条件
update:更新的数据
options:可选。用于修改计数的额外选项

(2)覆盖修改(将该条记录完全覆盖)

db.comment.update({_id:"1"}.{name:NumberInt(1001)})

(3)局部修改(使用修改器$set来实现,默认只修改第一条数据)

db.comment.update({_id:"1"}.{$set:{name:NumberInt(1001)}})

(4)批量修改(更新所有用户为100的数据)

db.comment.update({userId:"100"}.{$set:{name:NumberInt(1001)}}.{multi:true})

(5)列值增长的修改

db.comment.update({_id:"3"}.{$inc:{num:NumberInt(1)}})

4.4 删除文档

(1)删除文档的语法

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

(2)删除所有数据

db.comment.remove({})

(3)删除_id = 1的记录

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

5、文档的分页查询

5.1 统计查询

db.collection.count(query, options)

query:查询选择条件
options:用于修改计数的额外选项

(1)统计comment集合的所有的记录数

db.comment.count()

(2)按条件统计记录数

统计userId为100的记录条数

db.comment.count({userId:"100"})

5.2 分页列表查询

(1)基础语法

使用limit()方法来读取指定数量的数据,使用skip()方法来跳过指定数量的数据。

db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

(2)limit方法(返回前n条数据)

返回指定条数的记录,可以在find方法后调用limit来返回结果
如下:返回前三条的数据

db.comment.find().limit(3)

(3)skip方法(跳过前n条数据)

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

db.comment.find().skip(3)

(4)分页样例

// 第一页
db.comment.find().skip(0).limit(3)
// 第二页
db.comment.find().skip(3).limit(3)
// 第三页
db.comment.find().skip(6).limit(3)
.....

5.3 排序查询

sort( )方法对数据进行排序,sort( )方法可以通过参数指定排序的字段,并使用1和-1来指定排序的方式,其中1为升序排列,而-1是用于降序排列。

(1)基础语法

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

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

(2)样例

对userId降序排列,并对number进行升序排列

db.comment.find().sort({userId:-1,number:1})

5.4 注意

执行顺序:先sort( ),再是skip( ),最后是limit( )和命令编写顺序无关

6、其它查询方式

6.1 正则复杂条件查询

(1)基础语法

MongoDB的模糊查询是通过正则表达式的方式实现的

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

完全支持JS的正则写法,功能强大

(2)样例

查询food里包含蛋糕的所有文档

db.comment.find({food:/蛋糕/})

6.2 比较查询

(1)基础语法

<,<=,>,>=相关操作符,格式如下

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

(2)样例

查询数量大于700的记录

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

6.3 包含查询

(1)基础语法及样例

包含使用$in操作符
查询集合中userId字段包含100或101的文档

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

不包含使用$nin操作符
查询集合中userId字段不包含100和101的文档

db.comment.find({userId:{$nin:["100","101"]}})

6.4 条件连接查询

(1)基础语法及样例

查询同时满足两个以上的条件,需要使用$and操作符将条件进行关联
$and:[{ },{ },{ }]
例如:查询集合中number大于等于700并且小于2000的文档

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

查询两个以上条件之间是或者的关系
$or:[{ },{ },{ }]
例如:查询集合中userId为10,或者点赞数小于100的文档记录

db.comment.find({$or:[{userId:"10"}, {number:{$lt:100}}]})

三、索引-Index

1、概述

索引支持在MongoDB中高效地执行查询。如果存在适当的索引,MongoDB可以使用该索引限制必须检查的文档数,提高查询效率。索引是特殊的数据结构,以易于遍历的形式存储集合数据集的一小部分。索引存储特定字段或一组字段的值,按字段值排序。索引项的排序支持有效的相等匹配和基于范围的查询操作。此外,MongoDB还可以使用索引中的排序返回排序结果。
MongoDB索引使用B树数据结构(B-Tree,MySQL是B+Tree)

2、单字段索引

MongoDB支持在文档的单个字段上创建用户定义的升序/降序索引,称为单字段索引。
对于单个字段索引和排序操作,索引键的排序顺序(即升序或降序)并不重要,因为MongoDB可以在任何方向上遍历索引。

3、复合索引

MongoDB支持多个字段的用户定义索引,即复合索引
复合索引中列出的字段顺序具有重要意义,若复合索引由{userId:1, score:-1}组成,则索引先按userId正序排序,然后在每个userId的值内,再按score倒序排序。

4、索引的管理操作

4.1 索引的查看

(1)说明

返回一个集合中的所有索引的数组

(2)语法

db.collection.getIndexes()

查看comment集合中所有的索引概况

4.2 索引的创建

(1)说明

在集合上创建索引

(2)语法

db.collection.createIndex(keys,options)

keys:包含字段和值对的文档,其中字段是索引键,值描述该字段的索引类型,上升索引,值为1,降序索引,值为-1。
options:可选。包含一组控制索引创建的选项的文档

(3)单字段索引

db.collection.createIndex({userId:1})

(4)复合索引

db.collection.createIndex({userId:1, name:-1})

4.3 索引的移除

(1)说明

可以移除指定的索引,或移除所有索引

(2)指定索引的移除

语法

db.collection.dropIndex(index)

index:索引名称或索引规范
示例

db.collection.dropIndex({userId:1})

(3)所有索引的移除

语法

db.collection.dropIndexes()

4.4 相关计划

(1)执行计划

分析查询性能通常使用执行计划(解释计划、ExplainPlan)来查看查询的情况。

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

(2)涵盖的查询

当查询条件和查询的投影仅包含索引字段时,MongoDB直接从索引返回结果,而不扫描任何文档或将文档带入内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/13801.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot与Loki的那些事

因为网上好多都没有通过Loki的API自己实现对日志监控系统&#xff0c;所以我就下定决心自己出一版关于loki与springboot的博文供大家参考&#xff0c;这个可以说是比较实用&#xff0c;很适合中小型企业。因此我酝酿了挺久了&#xff0c;对于loki的研究也比较久&#xff0c;希望…

论文精读《OFT: Orthographic Feature Transform for Monocular 3D Object Detection》

OFT: Orthographic Feature Transform for Monocular 3D Object Detection 文章目录OFT: Orthographic Feature Transform for Monocular 3D Object Detection论文精读摘要&#xff08;Abstract&#xff09;1. 介绍&#xff08;Introduction&#xff09;2. 相关工作&#xff08…

给开源项目做一个漂亮简洁的版本迭代更新图,生成固定链接复制到介绍中、公众号菜单链接中、博客中等

背景 开源项目的版本迭代与更新经常需要更新迭代文档&#xff0c;但是readme.md没有比较美观一点的效果&#xff0c;所以文本分享一种第三方的方式&#xff1a;用TexSpire的免费在线文档分享功能&#xff0c;手机、PC、Pad都可以适配。 效果预览 使用 第一步&#xff1a;创…

浅谈 async/await 和生成器

浅谈 async/await async/await 是ES8规范新增的&#xff0c;使得以同步方式写的代码异步运行不再是白日梦&#xff0c;进一步让代码逻辑更加清晰。 为什么新增 async/await 下面有这样一个需求&#xff1a;有两个请求&#xff0c;请求 1 的结果是请求 2 的参数&#xff0c;所…

机器学习6——EM算法与高斯混合模型GMM

前置内容 Jensen不等式 高斯混合模型 多元高斯模型 拉格朗日乘子法 主要内容 EM算法&#xff08;Expectation-Maximization&#xff09;&#xff0c;期望-最大化。 用于保证收敛到MLE&#xff08;最大似然估计&#xff09;。主要用于求解包含隐变量的混合模型&#xff0c;主要…

R生成三线表

R生成三线表table1包测试数据生成制作三线表Tableone包加载包 探索数据类型数据整理分类构建Table函数Tableone函数细节主要基于table1 或tableone 包table1包 测试数据生成 datadata.frame(性别sample(c("男","女"), 1000,replaceT),年龄round(rnorm(10…

2021年认证杯SPSSPRO杯数学建模A题(第一阶段)医学图像的配准全过程文档及程序

2021年认证杯SPSSPRO杯数学建模 A题 医学图像的配准 原题再现&#xff1a; 图像的配准是图像处理领域中的一个典型问题和技术难点&#xff0c;其目的在于比较或融合同一对象在不同条件下获取的图像。例如为了更好地综合多种信息来辨识不同组织或病变&#xff0c;医生可能使用…

5年自动化测试,终于进字节跳动了,年薪30w其实也并非触不可及

一些碎碎念 什么都做了&#xff0c;和什么都没做其实是一样的&#xff0c;走出“瞎忙活”的安乐窝&#xff0c;才是避开弯路的最佳路径。希望我的经历能帮助到有需要的朋友。 在测试行业已经混了5个年头了&#xff0c;以前经常听到开发对我说&#xff0c;天天的点点点有意思没…

java计算机毕业设计springboot+vue+elementUI永加乡精准扶贫信息管理系统

项目介绍 系统设计的主要意义在于&#xff0c;一方面&#xff0c;对于网站来讲&#xff0c;系统上线后可以带来很大的便利性&#xff0c;精准扶贫网站管理属于非常细致的管理模式&#xff0c;要求数据量大&#xff0c;计算机管理可以提高精确性&#xff0c;更为便利的就是信息…

NF-κB 信号通路调节细胞因子转录

NF-κB 大家族哺乳动物 NF-κB 家族由五种成员组成&#xff1a;RelA/p65、c-Rel、RelB、p50 (NF-κB1) 和 p52 (NF-κB2)&#xff0c;它们可以形成各种异源二聚体或者同源二聚体 (如常见 p50/RelA 异源二聚体)&#xff0c;并通过与启动子的 κB 位点结合来激活大量基因。所有 N…

Mysql常用函数

Mysql常用函数 字段拼接(concat) CONCAT() 函数用于将多个字符串连接成一个字符串 格式&#xff1a; select CONCAT(str1,str2,…) from table_name; #查询商品表&#xff0c;返回一列&#xff1a;商品名称&#xff08;价格&#xff09;。 SELECT concat(prod_name,(,prod…

【论文阅读】Weakly Supervised Semantic Segmentation using Out-of-Distribution Data

一篇弱监督分割领域的论文&#xff0c;发表在CVPR2022上&#xff1a; 论文标题&#xff1a; Weakly Supervised Semantic Segmentation using Out-of-Distribution Data 作者信息&#xff1a; 代码地址&#xff1a; https://github.com/naver-ai/w-ood Abstract 作者认为…

专精特新小巨人的申报条件

专精特新企业分为市级专精特新、省级专精特新和国家级专精特新。 在2018年&#xff0c;开展了国家第一批专精特新“小巨人” 企业申报工作。为了引导中小企业积极走“专精特新”发展之路&#xff0c;加快新旧动能转 换步伐&#xff0c;提升自主创新能力、加快转型升级&#xf…

软考的网络工程师对就业有用吗?

考证只是一个结果&#xff0c;学会技能才是最重要的。 视工作而言&#xff0c;软考中级网络工程师的性价比还是非常高的&#xff0c;对于从事同类的技术人员&#xff0c;基础扎实一般可以裸考通过。 含金量嘛&#xff0c;计算机专业可以以考代凭&#xff0c;毕竟证书是人社部和…

安装谷歌服务框架2022最新版本22.45.15失败

在这里(谷歌play服务框架下载安装安卓版-谷歌服务框架2022最新版本(Google Play 服务)下载22.45.15官方手机版-蜻蜓手游网 (qt6.com)http://www.qt6.com/XiaZai/155507.html)下载了谷歌服务框架(Google Play 服务)&#xff0c;其应用信息为&#xff1a; 包名&#xff1a;com.g…

Mutated 源代码解析 client (一)

Mutated , a C project https://github.com/scslab/mutated usage Main function in the client directory, mutated_synthetic.cc Line 14 parse the user arguments, such as “-h, -w, -c” parse_synthetic is implemented in client\opts_synthetic.cc Here, use th…

Dive into TensorFlow系列(3)- 揭开Tensor的神秘面纱

TensorFlow计算图是由op和tensor组成&#xff0c;那么tensor一般都用来代表什么呢&#xff1f;显然&#xff0c;像模型的输入数据、网络权重、输入数据经op处理后的输出结果都需要用张量或特殊张量进行表达。既然tensor在TensorFlow体系架构中如此重要&#xff0c;因此本文将带…

Redis通用命令和key的层级结构

目录 1 Redis数据结构介绍 2 Redis 通用命令 3 Redis命令-Key的层级结构 1 Redis数据结构介绍 Redis是一个key-value的数据库&#xff0c;key一般是String类型&#xff0c;不过value的类型多种多样&#xff1a; value的数据类型共有8种&#xff0c;前面5中为基本数据类型&a…

5000立方米球罐设计

目 录 摘 要 I Abstract II 1 文献综述 1 1.1 课题研究的工程背景及理论、实际意义 1 1.2 球罐用钢 1 1.2.1 球罐用钢基本要求分析 1 1.2.2 国内外球罐的常用钢种 2 1.2.3 几种典型球罐用钢的优劣对比 2 1.3 球罐设计 3 1.3.1 球罐设计的执行标准及法规 3 1.3.2 球壳结构 4 1.3…

通过PLC网关如何实现三菱FX3U的远程上下载程序?

FX3U是三菱推出的高性能PLC品牌。基本性能大幅提升&#xff0c;晶体管输出型的基本单元内置了3轴独立最高100kHz的定位功能&#xff0c;并且增加了新的定位指令&#xff0c;从而使得定位控制功能更加强大&#xff0c;使用更为方便&#xff0c;受到企业的青睐。因此&#xff0c;…