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

一文详解Mongodb数据库,适合大数据存储

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

什么是数据库

在网络交互的过程中,不仅会有数据的传递,也会有新数据的产生。比如我们目前的网站登录注册项目,在用户注册后,我们只是把数据添加到了服务器的内存中,但是程序一旦关闭或者重启,内存中的数据就消失了,服务器会恢复到最初的样子,那注册的用户数据也就没有了。这对于网站来讲,是不可接受的。那么如何解决这个问题呢?

服务器程序,就像是我们大脑的记忆,并不是长久的,一旦重启,就会失忆。俗话说,好记性不如烂笔头。因此最好的办法,就是把数据记录并保存下来。

在早期的网站中,通过把数据写入到文件中来进行保存,即便电脑关闭重启,文件也不会消失。但慢慢的又发现了问题,当文件存储内容过多的时候,很难找到我们想要的那条数据,而且,读取文件也是一个非常耗时的过程。

为了能够更好的存储数据,数据库应运而生,在本系列课程中,我们要使用的数据库是MongoDB

图书馆是一个存储图书的地方,粮仓是用来存储粮食的。数据库,顾名思义,就是专门用来存储数据的仓库。存储在数据库中的数据,能够长期的保存,并且易于查找。

在数据库中,数据不是杂乱无章的,它们会放在一个一个的小盒子里,在MongoDB中这些盒子就称为集合。一个数据库中可以有多个集合,而集合中存储的是一条一条的数据。

MongoDB简介

NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。

在现代的计算系统上每天网络上都会产生庞大的数据量。

这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理。 1970年 E.F.Codd's提出的关系模型的论文 "A relational model of data for large shared data banks",这使得数据建模和应用程序编程更加简单。

通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化数据存储在网络和商务应用的主导技术。

NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。

  • 易扩展: NoSQL数据库种类繁多, 但是一个共同的特点都是去掉关系数据库的关系型特性。 数据之间无关系, 这样就非常容易扩展
  • 大数据量,高性能: NoSQL数据库都具有非常高的读写性能, 尤其在大数据量下表现优秀。 这得益于它的非关系性,数据库的结构简单
  • 灵活的数据模型: NoSQL无需事先为要存储的数据建立字段, 随时可以存储自定义的数据格式。 而在关系数据库中, 增删字段是一件非常麻烦的事情。

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

在高负载的情况下,添加更多的节点,可以保证服务器性能。

MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

  • 安装:sudo apt install -y mongodb
  • 默认端口:27017
  • 默认配置文件的位置:/etc/mongod.conf
  • 默认日志的位置:/var/log/mongodb/mongod.log
  • 查看日志:grep -v '#' /etc/mongodb.conf

创建和删除数据库

  • 创建/切换数据库:use DATABASE_NAME,如果数据库不存在,则创建数据库,否则切换到指定数据库。没有切换数据库的情况下默认使用test数据库。
  • 查看所有数据库:show dbs / show databases
  • 删除当前的数据库:db.dropDatabase()

创建和删除集合

  • 创建集合:db.createCollection(name,options)db.createCollection('stu', { capped:true, size:200, max:2} )参数capped:默认值为false表示不设置上限,值为true表示设置上限参数size:集合所占用的字节数。 当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限时, 会将之前的数据覆盖,单位为字节参数max:文档最大数量
  • 查看集合:show collections
  • 删除集合:db.集合名称.drop()
  • 检查集合是否设定上限: db.集合名.isCapped()

启动方式:测试启动

  • 启动: sudo service mongod start
  • 停止: sudo service mongod stop
  • 重启: sudo service mongod restart

启动失败:Failed to start mongod.service: Unit mongod.service not found.

  • 解决方案
    • 创建配置文件:sudo vim /etc/systemd/system/mongodb.service
    • [Unit] Description=High-performance, schema-free document-oriented database After=network.target [Service] User=mongodb ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf [Install] WantedBy=multi-user.target
  • 启动服务
    • sudo systemctl start mongodb
    • sudo systemctl status mongodb
    • 检测是否启动成功:ps aux | grep mongod
    • 永久启动:sudo systemctl enable mongodb

生产环境正式的启动方式

启动: sudo mongod [--auth --dbpath=dbpath --logpath=logpath --append --fork] [-–f logfile ]

  • 只以 sudo mongod 命令启动时,默认将数据存放在了 /data/db 目录下,需要手动创建
  • --dbpath: 指定数据库的存放路径
  • --logpath: 指定日志的存放路径
  • --append: 或--logappend 设置日志的写入形式为追加模式
  • --fork: 或-fork 开启新的进程运行mongodb服务
  • --f: 或-f 配置文件路径(可以将上述配置信息写入文件然后通过该文件中的参数进行加载启动)
  • --auth: 以权限认证的方式启动

配置文件启动

sudo mongod -f mogo_start.cfg

dbpath=/home/cat/data/db
logpath=/home/cat/data/mongodb.log
logappend=true
fork=true

mongoDB支持的数据类型

mongoDB文档存储是使用BSON类型,BSON(BSON short for Bin-ary JSON, is a bin-ary-en-coded seri-al-iz-a-tion of JSON-like doc-u-ments)是二进制序列化的形式。类如JSON,同样支持内嵌各种类型。

MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中

下表为MongoDB 常用的几种数据类型:

数据类型

描述

String

字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。

Integer

整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。

Boolean

布尔值。用于存储布尔值(真/假)。

Double

双精度浮点值。用于存储浮点值。

Array

用于将数组或列表或多个值存储为一个键。

Timestamp

时间戳。记录文档修改或添加的具体时间。

Object

用于内嵌文档。

Null

用于创建空值。

Date

日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。

Object ID

对象 ID。用于创建文档的 ID。  (每个文档都有)

ObjectId

ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes,含义是:

  • 前 4 个字节表示创建 unix时间戳,格林尼治时间 UTC 时间,比北京时间晚了 8 个小时
  • 接下来的 3 个字节是机器标识码
  • 紧接的两个字节由进程 id 组成 PID
  • 最后三个字节是随机数

增删改查

  • 插入数据:db.集合名称.insert(document)
    • db.stu.insert({name:'xiaoming', gender:true, age:10, class:'2年4班', score:100})
    • db.stu.insert([{ name:'xiaomei', gender:false, age:12, class:'2年3班', score:90 },{ name:'xiaohong', gender:false, age:12, class:'2年3班', score:96 },{ name:'Jack', gender:false, age:12, class:'2年2班', score:98 },{ name:'Allen', gender:true, age:12, class:'2年3班', score:90 }])
    • 插文档时,如果不指定_id参数,MongoDB会为文档自动分配一个唯一的ObjectId
  • mongodb的保存:db.集合名称.save(document)
    • 如果文档的_id已经存在则修改,如果_id不存在则添加
  • mongodb的查询
    • db.集合名称.find({条件文档})
    • 方法findOne():查询,只返回第一个db.集合名称.findOne({条件文档})
    • 方法pretty(): 将结果格式化;不能和findOne()一起使用!db.集合名称.find({条件文档}).pretty()
  • 比较运算符
    • 等于: 默认是等于判断, 没有运算符
    • 小于:$lt (less than)
    • 小于等于:$lte (less than equal)
    • 大于:$gt (greater than)
    • 大于等于:$gte
    • 不等于:$ne
  • 逻辑运算符
    • and:在json中写多个条件即可
    • or:使用$or, 值为数组, 数组中每个元素为json
    • 范围运算符:使用$in$nin 判断数据是否在某个数组内
  • 使用$regex编写正则表达式:db.stu.find({name:{$regex:'^张'}})
  • 自定义查询
    • shell 是一个js的执行环境
    • 使用$where写一个函数, 返回满足条件的数据
    • db.stu.find({ $where:function() { return this.age + 10>= 18; } })
  • skip和limit分页查询:db.stu.find().skip((page-1)*num).limit(x)
  • 投影,在查询到的返回结果中, 只选择必要的字段
    • db.集合名称.find({},{字段名称:1,...})
    • 参数为字段与值, 值为1表示显示, 值为0不显
    • 特别注意:对于_id列默认是显示的, 如果不显示需要明确设置为0对于其他不显示的字段不能设置为0db.stu.find({},{_id:0,name:1,gender:1})
  • 排序:db.集合名称.find().sort({字段:1,...})
    • 参数1为升序排列
    • 参数-1为降序排列
    • db.stu.find().sort({score:-1,age:1})
  • 统计个数
    • db.集合名称.estimated_document_count()
    • db.集合名称.count_documents({条件})
  • 去重:db.集合名称.distinct(字段,{条件})
  • 更新:db.集合名称.update({query}, {update}, {multi: boolean})
    • 参数query:查询条件
    • 参数update:更新操作符
    • 参数multi:可选,默认是false,表示只更新找到的第一条数据,值为true表示把满足条件的数据全部更新multi参数必须和$set一起使用!
  • 删除:db.集合名称.remove({query}, {justOne: boolean})
    • 参数query:可选,删除的?档的条件
    • 参数justOne:可选, 如果设为true或1,则只删除一条,默认false,表示删除全部

相关文章

相关推荐

python创建文件夹,轻松搞定,喝咖啡去了

最近经常在录视频课程,一个课程下面往往有许多小课,需要分多个文件夹来放视频、PPT和案例,这下可好了,一个一个手工创建,手酸了都做不完。别急,来段PYTHON代码,轻松搞定,喝咖啡去了!import...

如何编写第一个Python程序_pycharm写第一个python程序

一、第一个python程序[掌握]python:python解释器,将python代码解释成计算机认识的语言pycharm:IDE(集成开发环境),写代码的一个软件,集成了写代码,...

Python文件怎么打包为exe程序?_python3.8打包成exe文件

PyInstaller是一个Python应用程序打包工具,它可以将Python程序打包为单个独立可执行文件。要使用PyInstaller打包Python程序,需要在命令行中使用py...

官方的Python环境_python环境版本

Python是一种解释型编程开发语言,根据Python语法编写出来的程序,需要经过Python解释器来进行执行。打开Python官网(https://www.python.org),找到下载页面,选择...

[编程基础] Python配置文件读取库ConfigParser总结

PythonConfigParser教程显示了如何使用ConfigParser在Python中使用配置文件。文章目录1介绍1.1PythonConfigParser读取文件1.2Python...

Python打包exe软件,用这个库真的很容易

初学Python的人会觉得开发一个exe软件非常复杂,其实不然,从.py到.exe文件的过程很简单。你甚至可以在一天之内用Python开发一个能正常运行的exe软件,因为Python有专门exe打包库...

2025 PyInstaller 打包说明(中文指南),python 打包成exe 都在这里

点赞标记,明天就能用上这几个技巧!linux运维、shell、python、网络爬虫、数据采集等定定做,请私信。。。PyInstaller打包说明(中文指南)下面按准备→基本使用→常用...

Python自动化办公应用学习笔记40—文件路径2

4.特殊路径操作用户主目录·获取当前用户的主目录路径非常常用:frompathlibimportPathhome_dir=Path.home()#返回当前用户主目录的Path对象...

Python内置tempfile模块: 生成临时文件和目录详解

1.引言在Python开发中,临时文件和目录的创建和管理是一个常见的需求。Python提供了内置模块tempfile,用于生成临时文件和目录。本文将详细介绍tempfile模块的使用方法、原理及相关...

python代码实现读取文件并生成韦恩图

00、背景今天战略解码,有同学用韦恩图展示各个产品线的占比,效果不错。韦恩图(Venndiagram),是在集合论数学分支中,在不太严格的意义下用以表示集合的一种图解。它们用于展示在不同的事物群组之...

Python技术解放双手,一键搞定海量文件重命名,一周工作量秒搞定

摘要:想象一下,周五傍晚,办公室的同事们纷纷准备享受周末,而你,面对着堆积如山的文件,需要将它们的文件名从美国日期格式改为欧洲日期格式,这似乎注定了你将与加班为伍。但别担心,Python自动化办公来...

Python路径操作的一些基础方法_python路径文件

带你走进@机器人时代Discover点击上面蓝色文字,关注我们Python自动化操作文件避开不了路径操作方法,今天我们来学习一下路径操作的一些基础。Pathlib库模块提供的路径操作包括路径的...

Python爬取下载m3u8加密视频,原来这么简单

1.前言爬取视频的时候发现,现在的视频都是经过加密(m3u8),不再是mp4或者avi链接直接在网页显示,都是经过加密形成ts文件分段进行播放。今天就教大家如果通过python爬取下载m3u8加密视频...

探秘 shutil:Python 高级文件操作的得力助手

在Python的标准库中,shutil模块犹如一位技艺精湛的工匠,为我们处理文件和目录提供了一系列高级操作功能。无论是文件的复制、移动、删除,还是归档与解压缩,shutil都能以简洁高效的方式完成...

怎么把 Python + Flet 开发的程序,打包为 exe ?这个方法很简单!

前面用Python+Flet开发的“我的计算器v3”,怎么打包为exe文件呢?这样才能分发给他人,直接“双击”运行使用啊!今天我给大家分享一个简单的、可用的,把Flet开发的程序打包为...