Mongodb——快速入门,2个小时足够了

news2024/11/22 1:35:54

目录

1、Mongodb概述

1.1、为何使用Mongodb?

1.2、业务应用场景

1.3、Mongodb和MySQL的区别

2、Mongodb安装

2.1、Windows系统中安装启动

3、Mongodb的操作

3.1、数据库操作

3.2、集合操作

3.2.1、集合显式创建

3.2.2、集合的隐式创建

3.2.3集合的删除

3.3、文档基本CRUD

3.3.1、文档插入

3.3.2、文档的基本查询

3.3.3、文档的更新

3.3.4、删除文档

3.4、文档的分页查询

3.4.1、统计查询

3.4.2、分页列表查询

3.4.3、排序查询

3.5、文档的其他查询

3.5.1、正则的复杂条件查询

3.5.2、比较查询

3.5.3、包含查询

3.5.4、条件连接查询

3.6、常用命令小结


1、Mongodb概述

1.1、为何使用Mongodb?

Mongodb用来应对“三高”问题:

高并发:对数据库高并发读写的需求。

高性能:对海量数据的高效存储和访问的需求。

高可用:对数据库的高扩展性和高可用性的需求。

MySQL数据库在面临这“三高”时,显得力不从心,所以学习Mongodb才更能丰富业务场景的处理能力。

MongoDB 是一个开源的 NoSQL 数据库,具有高可扩展性、灵活性和可靠性等优点,适合于处理分布式、大规模和敏捷的数据存储需求。

1.2、业务应用场景

  1. 大型 Web 应用: MongoDB 可以存储非结构化、半结构化和结构化数据,适用于存储用户数据、日志、社交媒体内容等各种类型的数据。同时,MongoDB 支持水平扩展和负载均衡,可以满足大量请求的高并发访问需求。

  2. 实时数据分析: MongoDB 支持 MapReduce 和聚合管道等复杂的数据分析操作,可以处理海量实时数据,并将结果存储在集合中,方便后续查询和分析。此外,MongoDB 还支持全文搜索和地理空间索引等功能,可以对文本和地理位置数据进行快速检索。

  3. 物联网应用: MongoDB 支持 JSON 格式的数据存储和查询,适用于存储传感器数据、设备状态等物联网数据。MongoDB 还具有轻量级和低延迟的特点,可以提供实时响应和快速插入大量数据的能力。

  4. 游戏应用: MongoDB 支持文档型数据存储和 ACID 事务,适用于存储游戏数据、用户配置等各种类型的数据。MongoDB 还支持多语言驱动程序和分片集群等特性,可以满足高并发的游戏场景需求。

  5. 移动应用: MongoDB 支持可嵌入的文档型数据库模式和 BSON 格式,适用于移动设备端本地存储和离线访问。同时,MongoDB 还支持数据同步和副本集备份等功能,可以确保数据在不同设备之间的一致性。

1.3、Mongodb和MySQL的区别

MySQLMongodb
数据库(database)数据库(database)
表(table)collection(集合)
行(row)document(文档)
字段(column)field(字段)
索引(index)index(索引)
primary key(主键)primary key(主键 _id)

2、Mongodb安装

2.1、Windows系统中安装启动

第一步,下载安装包

MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,可以从 MongoDB 官网下载安装, MongoDB 预编译二进制包下载地址: https://www.mongodb.com/download-center#community

选择下载版本以及下载环境,msi安装包,点击Download按钮下载

安装完后,新建log文件夹,mongodb.config文件,新建data目录,其中新建一个db文件夹。

dbpath=E:\java\Mongodb\data\db
logpath=E:\java\Mongodb\log\mongod.log#日志输出文件路径
logappend=true#错误日志采用追加模式

journal=true#启用日志文件,默认启用

quiet=true #过滤掉无用的日志信息,若需要调试使用请设置为false

port=27017 #端口号 默认为27017

 启动,cmd窗口输入以下命令

mongod --dbpath "安装路径\db"  --logpath "安装路径\mongod.log"  --install -serviceName "MongoDB"  

 访问localhost:27017,如果出现以下页面,代表安装成功

 可以通过services.msc打开服务列表,找到mongodb的服务查看

 配置环境变量,在Path环境中添加一个mongodb的环境

把mongodb的安装bin目录添加至Path环境中。

 

 输入mongo,如果出现以下信息,代表配置成功

3、Mongodb的操作

3.1、数据库操作

选择和创建数据库的语法格式:

连接mongodb数据库

mongo

显示所有数据库

show databases;

  

选择使用数据库

use 数据库名

 

 删除数据库

db.dropDatabase()

3.2、集合操作

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

显示出所有集合

show tables

 或者

show collections

3.2.1、集合显式创建

db.createCollection(name)

其中name为集合的名字

集合的命名规范
1、集合名不能是空字符串 ""
2、集合名不能含有 \0 字符(空字符 ) ,这个字符表示集合名的结尾。
3、集合名不能以 "system." 开头,这是为系统集合保留的前缀。
4、用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$

3.2.2、集合的隐式创建

当向一个集合中插入一个文档的时候,如果集合不存在,则会自动创建集合。
提示:通常使用隐式创建文档即可。

3.2.3集合的删除

db.collection.drop()

或者

db.集合名.drop()
返回值
如果成功删除选定集合,则 drop() 方法返回 true ,否则返回 false
例如:要删除 mycollection 集合
db.mycollection.drop()

3.3、文档基本CRUD

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

3.3.1、文档插入

(1)单个文档插入
使用insert()或save()方法向集合中插入文档
提示
1、 集合如果不存在,则会隐式创建。
2、mongo 中的数字,默认情况下是 double 类型,如果要存整型,必须使用函数 NumberInt( 整型数字 ) ,否则取出来就有问题了。
3、插入当前日期使用 new Date()。
4、插入的数据没有指定 _id ,会自动生成主键值。
5、如果某字段没值,可以赋值为 null ,或不写该字段。
6、出现WriteResult({"nInserted":1})就代表添加成功。
注意
1. 文档中的键 / 值对是有序的。
2. 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档 )
3. MongoDB 区分类型和大小写。
4. MongoDB 的文档不能有重复的键。
5. 文档的键是字符串。除了少数例外情况,键可以使用任意 UTF-8 字符。
文档键命名规范:
键不能含有 \0 ( 空字符 ) 。这个字符用来表示键的结尾。
. $ 有特别的意义,只有在特定环境下才能使用。
以下划线 "_" 开头的键是保留的 ( 不是严格要求的 )
批量插入
db.集合名.insertMany([{document1},{document2},{document3}...])

注意:插入时指定了 _id ,则主键就是该值,如果没有指定,则自动生成。
如果某条数据插入失败,将会终止插入,但已经插入成功的数据不会回滚掉。
因为批量插入由于数据较多容易出现失败,因此,可以使用 try catch 进行异常捕捉处理,测试的时候可以不处理。
try {
db.comment.insertMany([
{"name":"王五","age":23,"address":"天津"},{"name":"赵四","age":25,"address":"河北省"}
]);
} catch (e) {
print (e);
}

3.3.2、文档的基本查询

查询数据的语法格式如下:
db.集合名.find(<query>,[projection])
ParameterTypeDescription
querydocument
可选。使用查询运算符指定选择筛选器。若要返回集合中的所有文档,请省略此参数或传递空文档
( {} )
projectiondocument
可选。指定要在与查询筛选器匹配的文档中返回的字段(投影)。若要返回匹配文档中的所有字段,
请省略此参数
(1)查询所有
db.集合名.find()
db.集合名.find({})

(2)指定查询

会发现每条文档会有一个叫 _id 的字段,这个相当于我们原来关系数据库中表的主键,当你在插入文档记录时没有指定该字段, MongoDB会自动创建,其类型是 ObjectID 类型。
如果我们在插入文档记录时指定该字段也可以,其类型可以是 ObjectID 类型,也可以是 MongoDB 支持的任意类型。
比如我想查询 名字 张三 的记录,怎么办,很简单!只要在 fifind() 中添加参数即可,参数也是 json 格式,如下:
db.集合名.find({"name":"张三"})

如果你只需要返回符合条件的第一条数据,我们可以使用 fifindOne 命令来实现,语法和 fifind 一样。
如:查询用户编号是 name为王五 的记录,但只最多返回符合条件的第一条记录。

 

(3)投影查询(projection Query)
如果要查询结果返回部分字段,则需要使用投影查询(不显示所有字段,只显示指定的字段)。
如:查询结果只显示 _id name 、age   :
db.集合名.find({条件},{name:1,age:1})

 默认 _id 会显示。

如果不想显示主键_id,如下

db.集合名.find({条件},{name:1,age:1,_id:0})

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

db.集合名.find({},{name:1,age:1})

3.3.3、文档的更新

db.collection.update(query, update, options)
Parameter
Type
Description
query
document
更新的选择条件。可以使用与 fifind ()方法中相同的查询选择器,类似 sql update 查询内 where 后面的。。在 3.0 版中进行了更改:当使用 upsert:true 执行 update ()时,如果查询使用点表示法在 _id 字段上指定条件,则 MongoDB 将拒绝插入新文档。
update
document
or
pipeline
要应用的修改。包含更新运算符表达式的文档,或仅包含:对的替换文档,或在 MongoDB 4.2 中启动聚合管道。
upsert
boolean
可选。如果设置为 true ,则在没有与查询条件匹配的文档时创建新文档。默认值为 false ,如果找不到匹配项,则不会插入新文档。
multi
boolean
可选。如果设置为 true ,则更新符合查询条件的多个文档。如果设置为 false ,则更新一个文档。默认值为 false
(1)覆盖的修改
如果我们想修改name为张三,地址改为河南, 输入以下语句
db.mymongodb.update({"name":"张三"},{address:'河南'})

修改之后,发现除了address字段,其他属性全部没有了,这是因为修改覆盖了原有的数据,没有填写值默认为空了。

 (2)局部修改

为了解决上面的问题,我们需要使用修改器 $set 来实现,命令如下:
 db.mymongodb.update({"name":"王五"},{$set:{name:'张三',age:23,address:'河南'}})

 (3)批量修改

更新所有名叫张三的,修改地址为北京

//默认只修改第一条数据
db.mymongodb.update({name:"张三"},{$set:{address:"北京"}})
//修改所有符合条件的数据
db.mymongodb.update({name:"张三"},{$set:{address:"北京"}},{multi:true})
提示:如果不加后面的参数,则只更新符合条件的第一条记录。
 (4)列值增长的修改
如果我们想实现对某列值在原有值的基础上进行增加或减少,可以使用 $inc 运算符来实现。
现在我们需要将名叫赵四的年龄增长1岁,命令如下:
db.mymogodb.update({name:"赵四"},{$inc:{age:1}})

3.3.4、删除文档

删除文档的语法结构

db.集合名.remove(条件)

(1)全部删除

db.mymongodb.remove({})

 (2)删除指定数据

删除_id为646ca1ac4abb1f18327276b7的数据

 db.mymongodb.remove({_id:ObjectId("646ca1ac4abb1f18327276b7")})

3.4、文档的分页查询

3.4.1、统计查询

db.集合名.count(query, options)
Parameter
Type
Description
query
document
查询选择条件。
options
document
可选。用于修改计数的额外选项。

(1)统计所有记录数

db.集合名.count()

(2)按条件统计记录数

db.comment.count({age:25})

3.4.2、分页列表查询

可以使用 limit() 方法来读取指定数量的数据,使用 skip() 方法来跳过指定数量的数据。
基本语法如下所示:
db.集合名.find().limit(NUMBER).skip(NUMBER)
如果你想返回指定条数的记录,可以在 find 方法后调用 limit 来返回结果 (TopN) ,默认值 20 ,例如:
db.mymongodb.find().limit(3)

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

db.mymongodb.find().skip(3)

 每页3个,第二页开始:跳过前三条数据,接着值显示4、5、6三条数据

3.4.3、排序查询

sort() 方法对数据进行排序, sort() 方法可以通过参数指定排序的字段,并使用 1 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用 于降序排列。
db.COLLECTION_NAME.find().sort({KEY:1})
或
db.集合名称.find().sort(排序方式)
对name进行 降序排列,并对age进行升序排列
db.mymongodb.find().sort({name:-1,age:1})
提示: skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip() ,最后是显示的 limit() ,和命令编写顺序无关。

3.5、文档的其他查询

3.5.1、正则的复杂条件查询

MongoDB 的模糊查询是通过 正则表达式 的方式实现的。格式为:
db.collection.find({field:/正则表达式/})
或
db.集合.find({字段:/正则表达式/})
提示:正则表达式是 js 的语法,直接量的写法。 例如,我要查询name包含“宋 的所有文档,代码如下:
db.comment.find({name:/宋/})

 如果要查询name的内容中以“张开头的

db.mymongodb.find({name:/^张/})

3.5.2、比较查询

<, <=, >, >= 这个操作符也是很常用的,格式如下 :
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
查询age大于 20 的记录
db.mymongodb.find({age:{$gt:30}})

3.5.3、包含查询

包含使用 $in 操作符。 示例:查询数据的集合中 name 字段包含宋江 或张飞 的文档
db.mymongodb.find({name:{$in:['宋江','张飞']}})

 

3.5.4、条件连接查询

我们如果需要查询同时满足两个以上条件,需要使用 $and 操作符将条件进行关联。(相 当于 SQL and ) 格式为:
$and:[ { },{ },{ } ]
示例:查询评论集合中 age 大于等于20   并且小于35 的文档:
db.mymongodb.find({$and:[{age:{$gte:20}},{age:{$lt:35}}]})

如果两个以上条件之间是或者的关系,我们使用 操作符进行关联,与前面 and的使用方式相同 

查询评论集合中name 姓张 ,或者age小于30 的文档记录
 db.mymongodb.find({$or:[{name:/^张/},{age:{$lt:30}}]})

3.6、常用命令小结

选择切换数据库:use articledb
插入数据:db.comment.insert({bson数据})
查询所有数据:db.comment.find();
条件查询数据:db.comment.find({条件})
查询符合条件的第一条记录:db.comment.findOne({条件})
查询符合条件的前几条记录:db.comment.find({条件}).limit(条数)
查询符合条件的跳过的记录:db.comment.find({条件}).skip(条数)
修改数据:db.comment.update({条件},{修改后的数据}) 或db.comment.update({条件},{$set:{要修改部分的字段:数据})
修改数据并自增某字段值:db.comment.update({条件},{$inc:{自增的字段:步进值}})
删除数据:db.comment.remove({条件})
统计查询:db.comment.count({条件})
模糊查询:db.comment.find({字段名:/正则表达式/})
条件比较运算:db.comment.find({字段名:{$gt:值}})
包含查询:db.comment.find({字段名:{$in:[值1,值2]}})或db.comment.find({字段名:{$nin:[值1,值2]}})
条件连接查询:db.comment.find({$and:[{条件1},{条件2}]})或db.comment.find({$or:[{条件1},{条件2}]})

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

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

相关文章

k8s进阶3——资源配额、资源限制

文章目录 一、基本了解1.1 资源计算1.2 调度机制1.3 服务质量等级 二、资源配额 ResourceQuota2.1 支持的限制资源2.2 配额作用域2.3 资源配额选型2.3.1 计算资源配额2.3.2 存储资源配额2.3.3 对象数量配额 三、资源限制 LimitRange3.1 限制资源大小值3.2 设置限制默认值3.3 限…

buu [NPUCTF2020]共 模 攻 击 1

题目描述: task: hint: 题目分析&#xff1a; 先看hint(提示)这一部分&#xff0c;标题已经提示了是共模攻击&#xff0c;看到有e1,e2,c1,c2,n也可以想到是共模攻击&#xff0c;之后得到c&#xff0c;继续往下做 此时有点不知如何下手&#xff0c;e 256 并且 gcd(e // 4,p…

接口测试工具Postman接口测试图文教程(超详细)

目录 一、前言 二、Postman安装和使用 三、请求方式 四、资金记录接口实例演示 一、前言 在前后端分离开发时&#xff0c;后端工作人员完成系统接口开发后&#xff0c;需要与前端人员对接&#xff0c;测试调试接口&#xff0c;验证接口的正确性可用性。而这要求前端开发进度…

games103——作业4

实验四主要使用 Shallow Wave 模拟流体 完整项目已上传至github。 文章目录 Height Feild(高度场)更新高度场更新速度场 Shallow Wave EquationDiscretization(离散化)一阶导数二阶导数 Discretized Shallow Wave EquationSolution 1Solution 2Pressure(压强)Viscosity(粘滞) 算…

​性能测试基础——性能测试方案

前面所说的测试分析等准备工作实际上最终目的是制定测试方案&#xff0c;测试方案一般包括&#xff1a; 项目的简要说明、项目系统结构、项目的业务结构、以及项目的性能需求、测试环境数据以及测试策略方法、测试案例、测试人员进度安排以及测试风险预估等等。 下面是一个一般…

FreeRTOS创建静态任务教程及所遇到的问题解决方法

静态任务和动态任务的区别 相对于动态任务&#xff0c;静态任务不需要动态分配内存&#xff0c;而是手动指定一个静态内存缓冲区&#xff0c;并在任务生命周期中一直使用该缓冲区。这可以避免动态内存分配时可能出现的内存碎片和内存泄漏问题&#xff0c;提高了系统的稳定性。…

【Python lxml、BeautifulSoup和html.parser区别介绍】零基础也能轻松掌握的学习路线与参考资料

区别介绍 &#xff08;1&#xff09;lxml lxml是Python的一个XML解析库&#xff0c;它基于libxml2和libxslt库构建&#xff0c;可以读取、操作和输出XML文档。lxml具有很强的性能和稳定性&#xff0c;在处理较大的XML文件时表现尤佳&#xff0c;并且支持XPath、CSS选择器等高…

PHP复习资料(未完待续)

&#xff08;未完待续&#xff0c;请持续关注此板块&#xff09; 【计科三四】雪课堂PHP期末模拟题&#xff1a;https://ks.wjx.top/vm/tUAmjxq.aspx# 【计科一二】PHP第一章练习题 https://ks.wjx.top/vm/QnjHad4.aspx# 【计科一二】PHP第二章练习题 https://ks.wjx.top/vm/h2…

ggplot绘制带误差棒、置信区间的柱状图,并调整颜色为渐变

ggplot绘制带误差棒、置信区间的柱状图,并调整颜色为渐变 简单绘制柱状图控制柱状宽度,间距调整颜色渐变简单绘制柱状图 要在ggplot中绘制带有置信区间的柱状图,你可以使用geom_bar和geom_errorbar函数来完成。下面是一个示例代码: library(ggplot2)# 创建一个示例数据集…

【LeetCode热题100】打卡第1天:两数之和

文章目录 两数之和⛅前言&#x1f512;题目&#x1f511;题解 两数之和 ⛅前言 大家好&#xff0c;我是知识汲取者&#xff0c;欢迎来到我们的LeetCode热题100刷题专栏&#xff01; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识算法与…

《操作系统》期末最全复习题及解释答案

文章目录 选择题填空题简答题程序题综合题1.银行家算法2.页面置换算法3.进程调度算法4.磁盘调度算法5.求物理/逻辑地址6.分页存储管理7.可变分区分配算法 选择题 若信号量S的初值为2&#xff0c;且有3个进程共享此信号量&#xff0c;则S的取值范围是&#xff08;B &#xff09;…

Downie 4 4.6.17 MAC上最新最好用的一款视频下载工具

Downie for Mac 简介 Downie是Mac下一个简单的下载管理器&#xff0c;可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们。 Downie 4 下载 Downie 4 for Mac Downie 4 for Mac软件特点 支持许多站点 -当前支持1000多个不同的…

Linux学习笔记 --- Linux基础命令

一. Linux的目录结构 目标&#xff1a;1. 掌握Linux系统的目录结构 2. 掌握Linux系统的路径表达形式 1.1 Linux系统的目录结构 我们知道&#xff0c;在操作系统中&#xff0c;文件系统的目录结构一般都是树形结构。Linux的目录结构是一个树型结构Windows 系统可以拥有多…

学习【菜鸟教程】【C++ 类 对象】【C++ 类的静态成员】

链接 1. 教程 可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时&#xff0c;这意味着无论创建多少个类的对象&#xff0c;静态成员都只有一个副本。 静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句&#xff0c;在创建第一个对象时…

用Lua或c调用go的库

用Lua或c调用go编写的库或函数 背景思路操作golua代码汇总 参考文章 又好久没有更新了&#xff0c;这次肯定又是遇上了什么问题&#xff0c;但又解决了的&#xff0c;才跑过来更新的。我也是翻遍了全网都没找到lua去调go代码的&#xff0c;于是干脆自己写一个 背景 作为提供统…

堆结构与堆排序

二叉树的概念 满二叉树&#xff1a;二叉树的每一层的节点数都达到最大值 完全二叉树&#xff1a;满二叉树或是从左往右依次变满的树 二叉树的数组表示 01234567 堆结构&#xff08;优先级队列结构&#xff09; 完全二叉树 大根堆&#xff1…

图数据库评估难?一篇教你搞定图数据库产品评估

随着数字经济时代全面开启&#xff0c;数据作为重要的生产要素&#xff0c;赋能作用日渐凸显&#xff0c;企业逐渐开始关注自身数字化水平和数据资产价值。而当各企业数智水平提升&#xff0c;其业务环境和计算场景呈现数据间关系交错复杂的特点。在面对需要深度挖掘数据间复杂…

C语言——存储类型

目录 1. auto 自动型2. static 静态2.1 修饰变量要知道&#x1f447;&#xff08;数据在Linux内核中的分配图&#xff09; 2.2 static 的特点⭐⭐⭐⭐⭐&#xff1a;2.2 修饰函数 3. extern4. register 寄存器类型 存储类型 存储类型有&#xff1a;auto static extern register…

2023最全selenium面试题及答案,测试员没有碰到算我输.....

一、前言 Selenium&#xff0c;是一个开源的框架&#xff0c;主要用于做HTML页面的UI自动化测试。不过&#xff0c;selenium IDE在去年官方已宣告放弃维护了。官网上放着一句话&#xff0c;selenium IDE is Dead。Selenium IDE是火狐浏览器的一个插件&#xff0c;是Selenium的…

上午面了个腾讯拿 38K 出来的,让我见识到了基础的天花板

今年的校招基本已经进入大规模的开奖季了&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好…