百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

一文45分钟带你MongoDB从入门到高阶,一步到位

itomcoil 2025-02-24 16:48 4 浏览

MongoDB简介

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

MongoDB体系结构

MongoDB与关系型数据库对比

关系型数据库

MongoDB

database(数据库)

database(数据库)

table(表)

collection(集合)

row(行)

document(BSON文档)

column(列)

field(字段)

index(唯一索引、主键索引)

index(地理位置索引、全文索引、哈希索引)

join(主外键关联)

embedded Document(嵌套文档)

primary key(指定1至N个列做主键)

primary key(指定_id field为主键)

前面说MongoDB用的是BSON文档,那么什么是BSON呢?

BSON简介

BSON是一种类json的一种二进制形式的存储格式,简称BinaryJSON,它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinaryData类型。

BSON可以做为网络数据交换的一种存储形式,是一种schema-less的存储形式,它的优点是灵活性高,但它的缺点是空间利用率不是很理想。{key:value,key2:value2}这是一个BSON的例子,其中key是字符串类型,后面的value值,它的类型一般是字符串,double,Array,ISODate等类型。

BSON有三个特点:轻量性、可遍历性、高效性

MongoDB中使用了BSON来存储数据和网络数据交换。把这种格式转化成文档这个概念,这里的一个Document也可以理解成关系型数据库中的一条记录,只是这里的Document的变化更丰富一些,如Document可以嵌套。

下面是MongoDB中Document里面可以出现的数据类型:

MongoDB安装

  1. 下载社区版MongoDB,下载地址:https://www.mongodb.com/try/download/community
  1. 将压缩包解压
  2. 可以直接启动或使用配置文件启动
  • 新建目录/data/mongo
  • 新建配置文件mongo.conf,内容如下:
 #数据库目录
dbpath=/data/mongo/  
port=27017
#监听ip地址,默认全部可以访问
bind_ip=0.0.0.0
#是否以后台启动的方式登录
fork=true
#日志路径
logpath = /data/mongo/MongoDB.log
#是否追加日志
logappend = true
#是否开启用户密码登录
auth=false

  • 启动

./bin/mongod -f mongo.conf

Mongo shell

  1. 启动mongo shell

./bin/mongo

  1. 指定主机和端口的方式

./bin/mongo --host=主机ip --port=端口

MongoDB GUI工具

  1. MongoDB Compass Community

MongoDBCompassCommunity由MongoDB开发人员开发,这意味着更高的可靠性和兼容性。它为MongoDB提供GUImongodb工具,以探索数据库交互,具有完整的CRUD功能并提供可视方式。借助内置模式可视化,用户可以分析文档并显示丰富的结构。为了监控服务器的负载,它提供了数据库操作的实时统计信息。就像MongoDB一样,Compass也有两个版本,一个是Enterprise(付费),社区可以免费使用。适用于Linux、Mac或Windows。

  1. NoSQLBooster(mongobooster)

NoSQLBooster是MongoDBCLI界面中非常流行的GUI工具。它正式名称为MongoBooster。NoSQLBooster是一个跨平台,它带有一堆mongodb工具来管理数据库和监控服务器。这个Mongodb工具包括服务器监控工具,VisualExplainPlan,查询构建器,SQL查询,ES2017语法支持等等......它有免费,个人和商业版本,当然,免费版本有一些功能限制。NoSQLBooster也适用于Linux、Mac或Windows。

MongoDB基础操作

1. 数据库与集合

1.1 查看数据库

show dbs;

1.2 切换数据库(如果没有对于数据库则创建)

use 数据库名;

1.3 查看集合

show tables;
#或者
show collections;

1.4 删除集合

 db.集合名.drop();

1.5 删除当前数据库

db.dropDatabase();

2. 数据增删改查

新增

2.1 数据新增

 db.user.insert({name:"小明",bithday:new ISODate("2020-09-01"),expectSalary:15000,gender:0,city:"bj"});

2.2 新增多条

db.user.insert([{name:"小李",bithday:new ISODate("2020-09-01"),expectSalary:18000,gender:0,city:"bj"},{name:"小王",bithday:new ISODate("2020-09-01"),expectSalary:25000,gender:0,city:"bj"}]);

查询

2.3 比较条件查询

db.集合名.find(条件)

示例:

db.user.find({expectSalary:{$gt:18000}})

2.4 逻辑条件查询

and 条件

MongoDB的find()方法可以传入多个key,每个key之间用逗号隔开,多个key之间是and的关系

or 条件

db.集合名.find({$or:[{key1:value1}, {key2:value2}]})

not条件

db.集合名.find({key:{$not:{$操作符:value}})

示例:

 db.user.find({city:"bj",expectSalary:{$gt:15000}})
 db.user.find({$or:[{city:"bj"},{expectSalary:{$gt:15000}}]});

2.5 分页查询

db.集合名.find({条件}).sort({排序字段:排序方式})).skip(跳过的行数).limit(一页显示多少数据)

示例:

db.user.find().sort({expectSalary:1}).limit(3)

排序时1代表升序,-1代表降序。


修改

2.6 数据更新

语法:

$set :设置字段值
$unset :删除指定字段
$inc:对修改的值进行自增
db.集合名.update(
 ,
 ,
 {
  upsert: ,
  multi: ,
  writeConcern: 
 }
)

参数说明:

  • query:update的查询条件,类似sql里面update语句where后面那段
  • update,update的对象和更新的操作符。$set、$inc等
  • upsert:可选,如果不存在的记录,是否新增。true:新增;false:不新增
  • multi:可选,默认是false,只更新查询到的第一条记录,true:代表把查询出来的多条记录都更新。
  • writeConcern:可选,用来指定mongo对写操作的回执行为。

示例:

db.user.update({name:"小明"},{$set:{gender:1}},{multi:true})


删除

2.7 数据删除

语法:

db.集合名.remove(
 ,
 {
  justOne: ,
  writeConcern: 
 }
)

参数说明:

  • query:删除的文档的条件
  • justOne:如果设为true或1,则只删除一个文档,如果不设置该参数或使用默认值false,则删除查询到的所有文档。
  • writeConcern:用来指定mongo对写操作的回执行为

示例:

db.user.remove({name:"小王"})

MongoDB聚合操作

聚合是MongoDB的高级查询语言,它允许我们通过转化合并由多个文档的数据来生成新的在单个文档里不存在的文档信息。一般都是将记录按条件分组之后进行一系列求最大值、最小值、平均值的简单操作,也可以对记录进行复杂数据统计、数据挖掘的操作。聚合操作的输入是集中的文档,输出可以是一个文档也可以是多个文档。

单目的聚合操作

常用命令:count()

db.user.find().count();

聚合管道

db.集合名.aggregate(操作)

MongoDB中聚合(aggregate)主要用于统计数据(诸如统计平均值、求和等),并返回计算后的数据结果。表达式:处理输入文档并输出。表达式只能用于计算当前聚合管道的文档,不能处理其它的文档。

聚合常见操作:

操作

描述

$group

将集合中的文档分组,可用于统计结果。

$project

修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。

$match

用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。

$limit

用来限制MongoDB聚合管道返回的文档数。

$skip

在聚合管道中跳过指定数量的文档,并返回余下的文档。

$sort

将输入文档排序后输出。

$geoNear

输出接近某一地理位置的有序文档。

表达式:处理输入文档并输出。表达式只能用于计算当前聚合管道的文档,不能处理其它的文档。

表达式

描述

$sum

计算总和

$avg

计算平均值

$min

获取集合中所有文档对应值得最小值

$max

获取集合中所有文档对应值得最大值

$push

在结果文档中插入值到一个数组中

$addToSet

在结果文档中插入值到一个数组中,但数据不重复

$first

根据资源文档的排序获取第一个文档数据

$last

根据资源文档的排序获取最后一个文档数据

示例:

db.user.aggregate([{$group:{_id:"$city",avgSal:{$avg:"$expectSalary"}}},{$project:{city:"$city",salary:"$avgSal"}}]);

db.user.aggregate([{$group:{_id:"$city",avgSal:{$avg:"$expectSalary"}}},{$match:{avgSal:{$gt:440}}}]);

db.user.aggregate([{$limit:2},{$sort:{expectSalary:-1}},{$group:{_id:"$name",avgSal:{$avg:"$expectSalary"}}}]);

MapReduce编程模型

Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多台Server上并行执行复杂的聚合逻辑。MongoDB不允许Pipeline的单个聚合操作占用过多的系统内存,如果一个聚合操作消耗20%以上的内存,那么MongoDB直接停止操作,并向客户端输出错误消息。

MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。

db.collection.mapReduce(
 function() {emit(key,value);}, //map 函数
 function(key,values) {return reduceFunction},  //reduce 函数
 {
  out: collection,
  query: document,
  sort: document,
  limit: number,
  finalize: ,
  verbose: 
 }
)

使用MapReduce要实现两个函数Map函数和Reduce函数,Map函数调用emit(key,value),遍历collection中所有的记录,将key与value传递给Reduce函数进行处理。

参数说明:

  • out:统计结果存放集合
  • query:一个筛选条件,只有满足条件的文档才会调用map函数
  • sort:和limit结合的sort排序参数
  • limit:发往map函数的文档数量上限
  • finalize:可以对reduce输出结果再一次修改
  • verbose:是否包括结果信息中的时间信息,默认为false

示例:

db.user.mapReduce(function(){emit(this.city,this.expectSalary);},function(key,value){return Array.avg(value)},{query:{expectSalary:{$gt:15000}},out:"cityAvgSal"})

书山有路勤为径,学海无涯苦作舟

相关推荐

MySql安装与使用

介绍mysql是目前最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(RelationalDatabaseManagementSystem:关系数据库管理系统)应用软件...

使用AI来搭建一个用户系统,步骤应该是怎样的呢?

我给AI的第一个问题是这样的:创建一个java21+springboot3.4+mysql21的一个用户系统,需要使用JWT,支持多语言,使用swagger,这个用户系统都应该包含哪...

Mysql 8.4数据库安装、新建用户和数据库、表单

1、下载MySQL数据库yuminstall-ywgetperlnet-toolslibtirpc#安装wget和perl、net-tools、libtirpcwgethtt...

介绍如何在 MySQL 中创建新用户并授予权限?

MySQL是一个开源的关系型数据库管理系统,常用于存储和管理大量的结构化数据。在使用MySQL进行数据管理时,为了安全和方便管理,通常需要创建新用户并授予相应的权限。本文将介绍如何在MySQL...

Mysql创建用户和权限管理

MySQL是一个多用户的数据库,最高权限管理者是root用户,它拥有着最高的权限操作。包括select、update、delete、update、grant等操作。如果有其他用户想使用MySQL,那么...

Mysql:创建用户详解

1、创建并授权用户--创建可从任何主机连接的用户CREATEUSER'myuser'@'%'IDENTIFIEDBY'mypassword'...

Python 实现【字符匹配】

defis_match(s,pattern):m,n=len(s),len(pattern)dp=[[False]*(n+1)for_inrange...

Python自动化:openpyxl工作簿、工作表相关操作

新建工作簿、工作表importopenpyxl#创建空白工作簿,会自动生成一个工作表:Sheetwb=openpyxl.Workbook()#新建工作表#create_sheet...

python每日一练之三数排序

概述今天主要分享一个三树排序的实例,大家可以自己测试玩一下~需求输入三个整数x,y,z,请把这三个数由小到大输出。方法一:如果是要练练手就随便找个排序算法实现一下#usr/bin/python#...

Python输出语句print()

Python中的输出语句主要通过内置函数print()实现,它可以灵活输出文本、变量、表达式结果等内容到控制台或其他文件。以下是详细介绍及示例:一、print()基本语法print(*object...

Python设置excel表格格式,这3个属性6个模块,要表格好看

前言:通过前面两篇文章,我们用Python处理excel数据得到了结果并保存了文件。打开文件会发现,文件里表格是没有设置格式的,还需手动调整行高列宽等样式,很麻烦。其实,通过Python库模块,能轻松...

python入门-day5-循环语句

以下是为“Day5:循环语句”设计的详细学习任务计划。这个任务旨在帮助初学者掌握Python中的循环语句(for和while),并通过实践理解它们的应用场景。Day5:循环语句学习目标...

Python基础编程必备!涵盖常见语法与操作的代码示例合集

以下是一份Python基础代码示例合集,涵盖了常见的语法和操作,适合初学者快速掌握基本编程概念:1.基础语法python#打印输出print("Hello,World!")#变...

Python循环语句实用教程

一、循环基础1.while循环基本语法:while条件表达式:循环体代码while循环流程图:应用示例:#简单计数器count=0whilecount<5:...

在 Python 中如何向一个已排序的数组(列表) 中插入一个数呢

在Python中如何向一个已排序的数组(列表)中插入一个数呢?方法有很多种,关键在于原来数组是什么样的排序,用到啥排序方法效率高,就用哪种。我们来练习其中的几种插入方法,另外也掌握下遍历数组的...