MongoDB,入门看这一篇足矣!

2024-02-06 11:04
文章标签 入门 一篇 mongodb 足矣

本文主要是介绍MongoDB,入门看这一篇足矣!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、介绍

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富、最像关系数据库的一款高性能的 NoSQL 数据库。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。

其中的文档类似于 JSON 对象。字段值可以包含其他文档、数组及文档数组,数据结构的支持非常灵活!

的确,在使用的过程当中,正如所介绍的,数据的存储和查询,性能极快,而且很好的满足我们的需求!

话不多说,下面我们就一起来了解一下,这款数据库应该如何使用!

二、环境配置

在学习它之前,我们需要先搭建好环境,MongoDB 的安装也非常简单!

Windows 平台
如果你是 Windows 平台,MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制,安装基本是傻瓜式的操作,登录 MongoDB 官网并且下载安装包,然后一步一步的操作即可!
在这里插入图片描述
Linux 平台
生产环境基本都是 Linux 平台,为了和生产保持一致,小编采用的服务器是CentOS7,安装过程也比较简单!

  • 创建资源文件
sudo vim /etc/yum.repos.d/mongodb-org-4.0.repo
  • 编辑内容如下
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
  • 运行以下命令安装 mongodb
sudo yum install -y mongodb-org
  • 安装完成之后,配置mongod.conf允许远程连接
#编辑mongod.conf
vim /etc/mongod.conf
#将net:bindIp: 127.0.0.1 改为 0.0.0.0
net:bindIp:0.0.0.0
  • 最后启动服务
#开启服务
systemctl start mongod#其他服务
#关闭服务
systemctl stop mongod#重启服务
systemctl restart mongod#开机自启
systemctl enable mongod

ubuntu平台

  • 安装MongoDB
sudo apt install -y mongodb-org
或者
sudo apt-get install mongodb
  • 查看运行状态
pgrep mongo -l
  • 其他的一些状态查询命令
sudo service mongodb start
sudo systemctl status mongodb
  • 停用
sudo systemctl stop mongodb
  • 启动
sudo systemctl start mongodb
  • 重启
sudo systemctl restart mongodb
  • 修改 MongoDB 是否自动随系统启动(默认:启用)
sudo systemctl disable mongodbsudo systemctl enable mongodb

至此,环境配置已经完成!

三、数据库操作

MongoDB 创建数据库的语法格式如下:

use DATABASE_NAME

如果数据库不存在,则创建数据库,否则切换到指定数据库。

输入如下命令,可以查询数据库列表

#查询数据库列表
show dbs#命令输出结果:
admin
config
local

可以看到,当前 MongoDB 有三个数据库!

输入如下命令,可以切换到admin数据库

use admin

输入db命令,还可以查询当前数据库

db

创建用户
默认的情况下,是没有用户的,也无法操作数据库,因此我们需要创建一个用户,同时给他分配权限!

创建一个管理员用户
创建一个用户、密码都是admin的用户,同时给这个用户分配userAdminAnyDatabase角色,指定的数据库为admin!

#创建一个admin用户
db.createUser(
{user: "admin",pwd: "admin",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})

其中字段含义如下:

  1. user:用户的名字;
  2. pwd:用户的密码;
  3. roles:指定用户的角色,可以用一个空数组给新用户设定空角色。
  4. roles 中的 role:指定角色。
  5. roles 中的 db:指定的数据库,例如上面中的角色userAdminAnyDatabase,只在 admin 数据库中可用。
    角色在 MongoDB 中,代表着某个用户是否有权限访问数据库或者操作数据库,理解这点非常重要!
    MongoDB 角色定义如下:
    在这里插入图片描述
    创建一个不受访问限制的超级用户
    如果你想创建一个不受访问限制的超级用户,赋予root角色即可!
#创建超级用户
db.createUser({user:"root",pwd:"root",roles:["root"]}
)

创建一个业务数据库普通用户
如果你想创建一个业务数据库普通用户,例如只能访问test_db数据库,并且只负责数据的増查改删。

# 创建或者切换数据库到test_db
use test_db# 创建一个test用户,并且只能访问test_db,对表只有读写权限
db.createUser(
{user: "test",pwd: "test",roles: [ { role: "readWrite", db: "test_db" } ]
})

验证用户是否可以正常登录
对于刚刚创建的用户,我们怎么验证它是否能正常登录呢?命令也很简单!

db.auth("test","test")

如果返回是1表示鉴权正常!
查询当前数据库用户信息
查询创建的用户,命令也很简单!

# 查看创建的用户
show users

修改用户密码
有些时候,我们会忘记密码,可通过如下方式进行修改!

#修改用户密码
db.changeUserPassword("username", "xxxxx")

删除用户
如果某个用户需要停用,可通过如下方式进行删除

#切换指定数据库
use test_db
#删除用户
db.dropUser('test')

删除数据库
如果某个数据库需要停用,可通过如下方式进行删除(只有超级管理员有权限删除)

#切换指定数据库
use test_db
#删除数据库
db.dropDatabase()

创建集合
MongoDB 并无表这个概念,而对应的定义叫:集合,我们在关系型数据库中看到的表数据,在 MongoDB 中被定义为:文档,MongoDB 也被很多人成为文档数据库!

在关系型数据库中,表数据是一行一行的存储,但是在 MongoDB 中,可能不是这样,如果你存储的 json 非常复杂,嵌套很深,那么在 MongoDB 中存储的行数,可能非常深,存储的时候类似我们在页面看到的父子表结构!

创建一个集合
MongoDB 中使用 createCollection() 方法来创建集合。

语法格式:

db.createCollection(name, options)

参数说明:

name: 要创建的集合名称
options: 可选参数, 指定有关内存大小及索引的选项
例如,在 test_db 数据库中创建 tb_user 集合:

# 切换到test_db数据库
use test_db
# 创建 tb_user 集合
db.createCollection("tb_user")
#输出结果
{ "ok" : 1 }

如果要查看已有的集合,可以使用show collections命令!

show collections

下面是带有几个关键参数的createCollection()的用法,下面命令表示:创建固定集合tb_user,整个集合空间大小6142800KB, 文档最大个数为10000 个

db.createCollection("tb_user", { capped : true, autoIndexId : true, size : 6142800, max : 10000 } )

在 MongoDB 中,很多时候不需要手动创建集合。当你插入一个文档时,MongoDB 会自动创建集合!

# 向集合tb_user 插入一条文档数据
db.tb_user.insert({"name" : "张三"})
#查询集合
show collections
# 输出结果
tb_user

删除一个集合
MongoDB 中使用 drop() 方法来删除集合。

语法格式:

db.collection.drop()

例如,删除在 test_db 数据库中 tb_user 集合:

# 切换到test_db数据库
use test_db
# 创建 tb_user 集合
db.tb_user.drop()
#输出结果
true

创建文档
创建文档,类似我们在关系型数据库中,将数据插入到数据库,操作也很简单!

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

语法如下:

db.COLLECTION_NAME.insert(document)
或
db.COLLECTION_NAME.save(document)

save():如果_id主键存在则更新数据,如果不存在就插入数据。
insert():若插入的数据主键已经存在,则会抛异常,提示主键重复,不保存当前数据。
例如,在test_db数据库的tb_user集合中,插入一条数据

db.tb_user.insert(
{name:"张三",age:18,gender:"男",tags: ['宅男', '技术控', '脱发严重']
})

如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。

查看已插入文档,命令如下:

#查询tb_user集合中的数据
db.tb_user.find()
# 输出结果
{ "_id" : ObjectId("6022310f6b5e964b0a5916e6"), "name" : "张三", "age" : 18, "gender" : "男", "tags" : [ "宅男", "技术控", "脱发严重" ] }

当然,你还可以通过save()命令进行插入,如果不指定_id字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。

例如,将张三年龄更新到30岁!

db.tb_user.save(
{_id: ObjectId("6022310f6b5e964b0a5916e6"),name:"张三",age:30,gender:"男",tags: ['宅男', '技术控', '脱发严重']
})

查看文档

db.tb_user.find()
# 输出结果
{ "_id" : ObjectId("6022310f6b5e964b0a5916e6"), "name" : "张三", "age" : 30, "gender" : "男", "tags" : [ "宅男", "技术控", "脱发严重" ] }

更新文档
MongoDB 提供了 update() 和 save() 方法来更新集合中的文档。

语法格式如下:

db.collection.update(<query>,<update>,{upsert: <boolean>,multi: <boolean>,writeConcern: <document>}
)

query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如inc…)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。
例如,将张三年龄更新到22岁!

db.tb_user.update({'name':'张三'},{$set:{'age':22}})

查询已更新的数据

db.tb_user.find()
# 输出结果
{ "_id" : ObjectId("602235216b5e964b0a5916e8"), "name" : "张三", "age" : 22, "gender" : "男", "tags" : [ "宅男", "技术控", "脱发严重" ] }

以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置multi参数为true。

db.tb_user.update({'name':'张三'},{$set:{'age':22}},{multi:true})

删除文档
MongoDB 中的remove()函数是用来移除集合中的数据

语法格式如下:

db.collection.remove(<query>,{justOne: <boolean>,writeConcern: <document>}
)

query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
writeConcern :(可选)抛出异常的级别。
例如,删除姓名为张三的用户

db.tb_user.remove({'name':'张三'})

查询数据是否被删除

```java
db.col.find()
#结果为空

查询文档
MongoDB 查询文档使用 find() 方法。

语法格式如下:

db.collection.find(query, projection)

query :可选,使用查询操作符指定查询条件
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:

db.col.find().pretty()

首先我们插入几条数据,插入结果如下:

图片
例如,查询一个性别为男的用户信息

#单个条件查询,类似 sql语句中的 gender = '男'
db.tb_user.find({"gender":"男"})

查询一个性别为男,姓名为张三的用户

#多条件查询,类似 sql语句中的 gender = '男' and name = '李四'
db.tb_user.find({"gender":"男","name":"李四"})

查询一个性别为男 或者 姓名为张三的用户

#多条件查询,类似 sql语句中的 gender = '男' or name = '李四'
db.tb_user.find({$or:[{"gender":"男"},{"name": "李四"}]})

查询一个性别为男 或者 姓名为张三,同时年龄大于30的用户

#多条件查询,类似 sql语句中的 age > 30 and ( gender = '男' or name = '李四')
db.tb_user.find({"age": {$gt:30}, $or:[{"gender":"男"},{"name": "李四"}]}

)
分页查询文档
如果需要分页查询集合数据,可以使用limit()和skip()函数,其中limit()表示读几条数据,skip()表示从第几条数据开始。

#从集合中的第三行数据开始,读2条数据返回

db.tb_user.find({}).limit(2).skip(3)

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

例如,查询tb_user文档,按照age进行升序排序!

db.tb_user.find({}).sort({"age":1})

创建索引
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB 在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。

这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。

创建索引
MongoDB 使用 createIndex() 方法来创建索引,语法格式如下:

db.collection.createIndex(keys, options)

语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可!

例如,给tb_user文档中的age创建一个索引!

db.tb_user.createIndex({"age":1})

创建索引是一个比较耗时的动作,我们还可以通过参数配置,在后台创建索引。

db.tb_user.createIndex({"age":1}, {background: true})

通过在创建索引时加background:true的选项,让创建工作在后台执行!

查看索引
MongoDB 提供了getIndexes()方法,可以进行查看索引。

例如,查询tb_user集合中的索引

db.tb_user.getIndexes()

删除索引
不在需要的索引,我们可以将其删除。删除索引时,可以删除集合中的某一索引,可以删除全部索引。

语法格式:

db.COLLECTION_NAME.dropIndex("INDEX-NAME")

例如,删除集合tb_user集合中的age索引:

#查询索引

db.tb_user.getIndexes()
#输出结果
[{"v" : 2,"key" : {"_id" : 1},"name" : "_id_","ns" : "test_db.tb_user"},{"v" : 2,"key" : {"age" : 1},"name" : "age_1","ns" : "test_db.tb_user"}
]

删除对应的age_1索引!

db.tb_user.dropIndex("age_1")

这篇关于MongoDB,入门看这一篇足矣!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/684110

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

MySQL入门到精通

一、创建数据库 CREATE DATABASE 数据库名称; 如果数据库存在,则会提示报错。 二、选择数据库 USE 数据库名称; 三、创建数据表 CREATE TABLE 数据表名称; 四、MySQL数据类型 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串类型 4.1 数值类型 数值类型 类型大小用途INT4Bytes整数值FLOAT4By

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是