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

工具 | 非关系型数据库mongo操作入门

wuantov 2025-07-19 23:12 9 浏览

摘要:

1. 传统关系型数据库的痛点

2. NoSQL的优势

3. MongoDB的优势

4. MongoDB的基本操作:命令行与pymongo

mongo 数据库是什么

说到mongoDB就不得不提到传统的关系型数据库。

传统关系型数据库

在现代的计算系统上每天网络上都会产生庞大的数据量,这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理。

关系型数据库,是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织[1]。

当前关系模型是结构化数据存储在网络和商务应用的主导技术。当今十大主流的关系型数据库Oracle,Microsoft SQL Server,MySQL,DB2,Microsoft Access, SQLite,Teradata(MySQL的一个分支),SAP。

常见的使用方式是:

select * from database;


但是,随着大数据时代的到来,关系型数据库逐渐体现出一些不能满足实际业务需求的问题。那么关系型数据的缺点是什么呢?

存在的问题

我们设想一个场景,如果我们在业务初期,设计的数据库包含7个字段,用着感觉也不错,但是现在做大做强了,忽然需要增加一个业务,比方说现在新来了一种通信方式叫做“巨信”,我们要存储一下客户的相关号码。这时怎么做呢?一个是在原表格上增加一列,另一种方式是新建一个表格,然后join到原来的表格上。貌似可行。

这时候需求又来了,如果公司又做大做强了,还需要其他的信息呢?在拥有海量的数据需要存储,岂不是要做无数表格,无数的JOIN操作?此外,海量数据带来的还有很多其他的问题,如下所列:

关系型数据库存在的问题[2]

1.网站的用户并发性非常高,往往达到每秒上万次读写请求,对于传统关系型数据库来说,硬盘I/O是一个很大的瓶颈

2.网站每天产生的数据量是巨大的,对于关系型数据库来说,在一张包含海量数据的表中查询,效率是非常低的

3.在基于web的结构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。当需要对数据库系统进行升级和扩展时,往往需要停机维护和数据迁移。

4.性能欠佳:在关系型数据库中,导致性能欠佳的最主要原因是多表的关联查询,以及复杂的数据分析类型的复杂SQL报表查询。为了保证数据库的ACID特性,必须尽量按照其要求的范式进行设计,关系型数据库中的表都是存储一个格式化的数据结构。


正所谓成也萧何,败也萧何。笔者认为关系型数据库的瓶颈也在于其结构化的表示方法。那么有没有方法能够不用这种“表格”式的方法来构建数据库呢?答案就是:非关系型数据库

NoSQL数据库

NoSQL(NoSQL = Not Only SQL,而不是不需要SQL ),指的是非关系型的数据库,意即"不仅仅是SQL",是对不同于传统的关系型数据库的数据库管理系统的统称。

非关系型数据库以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。

主要分为以下几类(知识所限,我了解的):

  1. 面向key-value

具有代表性的是Redis。redis比较明显的一个特点,支持5种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset (sorted set:有序集合)。

  1. 面向文档(document)

具有代表性的是MongoDB。此类数据库的主要特点是在海量的数据中可以快速的查询数据。文档存储通常使用内部表示法,可以直接在应用程序中处理,主要是JSON。没错,用JSON存储,一个JSON就是一个document。

像这样:


其实从上述结构中就很容易想到,很容易扩展,因为扩展只需要再JSON数据汇总增加一个“key”就可以,而不需要保持每个document需要有同样的字段,不是吗?

RDBMS vs NoSQL[3]

RDBMS

  • 高度组织化结构化数据
  • 结构化查询语言(SQL)
  • 数据和关系都存储在单独的表中。
  • 数据操纵语言,数据定义语言
  • 严格的一致性

NoSQL

  • 代表着不仅仅是SQL
  • 没有声明性查询语言
  • 没有预定义的模式 -键 - 值对存储,列存储,文档存储,图形数据库
  • 非结构化和不可预知的数据
  • 高性能,高可用性和可伸缩性

小结

  1. 非结构化数据库是在传统关系型数据库在大数据时代背景下产生的,用以满足非结构化查询的需求。相比传统关系型数据库既有缺点也有优点。优点是可扩展性强,缺点是没有结构化的数据,性能上有一定的影响
  2. mongodb就是NoSQL的一种,使用JSON存储数据。

为什么使用mongo数据库

MongoDB的一些基本概念

因为传统关系型数据库已经使用了很多年了,相关的概念已经深入人心,因此有必要对相关的概念与非结构化数据MongoDB进行对比。为了更好的理解MongoDB,这里给出一个与传统关系型数据库的术语对比:

SQL术语/概念

MongoDB术语/概念

解释/说明

database

database

数据库

table

collection

数据库表/集合

row

document

数据记录行/文档

column

field

数据字段/域

index

index

索引

table joins


表连接,MongoDB不支持

primary key

primary key

主键,MongoDB自动将_id字段设置为主键

MongoDB的优点/缺点

优点:

  • 高可扩展性(可随意扩展字段)
  • 分布式计算
  • 低成本
  • 架构的灵活性,半结构化数据(JSON)
  • 没有复杂的关系(不需要复杂的JOIN操作)

缺点:

  • 没有标准化
  • 有限的查询功能(到目前为止)

mongo数据库怎么使用

MongoDB安装

不同操作系统的可以参考如下链接进行安装:

Windows:https://www.runoob.com/mongodb/mongodb-window-install.html

macOS:https://www.runoob.com/mongodb/mongodb-osx-install.html

Linux:https://www.runoob.com/mongodb/mongodb-linux-install.html

命令行

# 连接数据库
./mongo
# 显示数据库
show dbs
# 显示数据库表格
show tables
# 设置当前数据库(注意不是表格)
use XXdb
# 查找所有项
db.XXdb.find()
# 查找具体某一项
db.XXdb.find()

eg:




> db.runoob.find()
{ "_id" : ObjectId("6131bbc5c3e97444f4b027c4"), "x" : 10 }
{ "_id" : ObjectId("6131bc35c3e97444f4b027c5"), "x" : 12 }
{ "_id" : ObjectId("6131bc3ec3e97444f4b027c6"), "x" : 144 }


> db.runoob.find({x:10})
{ "_id" : ObjectId("6131bbc5c3e97444f4b027c4"), "x" : 10 }

创建数据库

在insert的时候,如果原来数据库不存在,那么就直接创建一个数据库。

# 插入语句
> db.runoob.insert({x:10})
WriteResult({ "nInserted" : 1 })
> db.runoob.find({x:10})
{ "_id" : ObjectId("6131bbc5c3e97444f4b027c4"), "x" : 10 }

如上所示,如果runoob不存在,那么上述语句就会

1.创建一个名为runoob的数据库;

2.插入一条数据{x:10}

增删查改

db.runoob.insert(<document>)
#eg:
# 插入语句,同时创建数据库
> db.runoob.insert({x:10})
WriteResult({ "nInserted" : 1 })
> db.runoob.find({x:10})
{ "_id" : ObjectId("6131bbc5c3e97444f4b027c4"), "x" : 10 }

db.runoob.remove(<query>)
# eg:
> db.runoob.remove({x:10})
WriteResult({ "nRemoved" : 1 })

db.runoob.find(<query>)
#eg:
> db.runoob.find()
{ "_id" : ObjectId("6131bbc5c3e97444f4b027c4"), "x" : 10 }
{ "_id" : ObjectId("6131bc35c3e97444f4b027c5"), "x" : 12 }
{ "_id" : ObjectId("6131bc3ec3e97444f4b027c6"), "x" : 144 }

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

#eg:
> db.runoob.find()
{ "_id" : ObjectId("6131bc35c3e97444f4b027c5"), "x" : 12 }
{ "_id" : ObjectId("6131bc3ec3e97444f4b027c6"), "x" : 144 }
> db.runoob.update({x:12},{y:20})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.runoob.find()
{ "_id" : ObjectId("6131bc35c3e97444f4b027c5"), "y" : 20 }
{ "_id" : ObjectId("6131bc3ec3e97444f4b027c6"), "x" : 144 }

可扩展性示例

> db.runoob.find()
{ "_id" : ObjectId("6131bc35c3e97444f4b027c5"), "y" : 20 }
{ "_id" : ObjectId("6131bc3ec3e97444f4b027c6"), "x" : 144 }
{ "_id" : ObjectId("6131bf67fd8e703e23f71a67"), "z" : "mongodb" }
{ "_id" : ObjectId("6131bf9bfd8e703e23f71a68"), "xxx" : 10010 }
# 插入了一个非结构化的数据
> db.runoob.update({xxx:10010}, {$set:{z:"mongodb"}}, upsert=true)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.runoob.find()
{ "_id" : ObjectId("6131bc35c3e97444f4b027c5"), "y" : 20 }
{ "_id" : ObjectId("6131bc3ec3e97444f4b027c6"), "x" : 144 }
{ "_id" : ObjectId("6131bf67fd8e703e23f71a67"), "z" : "mongodb" }
{ "_id" : ObjectId("6131bf9bfd8e703e23f71a68"), "xxx" : 10010, "z" : "mongodb" }

小结

  1. mongo的数据库的增删查改与传统的数据库的思想一样,但是在具体的操作上,再不是使用select, update, delete等类似的操作,而是使用类似于编程语言(如果熟悉JavaScript的话,就可以立马看出来)
  2. mongodb可以插入非结构化的数据,相比传统关系型数据库扩展性更强

Python

Python 要连接 MongoDB 需要 MongoDB 驱动,这里我们使用 PyMongo 驱动来连接。

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]

# 列出数据库列表
dblist = myclient.list_database_names()
if "runoobdb" in dblist:
  print("数据库已存在!")

# 插入数据
mydict = { "name": "RUNOOB", "alexa": "10000", "url": "https://www.runoob.com" }
 
x = mycol.insert_one(mydict) 

# 查询数据
x = mycol.find_one()
# 查询所有数据
for x in mycol.find():
  print(x)

# 修改多个数据
myquery = { "name": { "$regex": "^F" } }
newvalues = { "$set": { "alexa": "123" } } #使用操作符$set
 
x = mycol.update_many(myquery, newvalues)

更多内容可以参考:
https://www.runoob.com/python3/python-mongodb.html

mongodb进阶

mongo 操作符汇总:
https://blog.csdn.net/sinat_29091823/article/details/75050950

find and modify :https://kb.objectrocket.com/mongo-db/mongodb-find-and-modify-1196

工具推荐

Navicat Premium 15(Windows)

这款工具是数据库方面比较好的工具,免去一切繁杂的命令行操作,直观的感受数据库。

支持的数据库包括:


编辑

添加图片注释,不超过 140 字(可选)

白嫖,可以参考这篇文章:
https://www.jianshu.com/p/4113cd5ef139

参考资料

  1. https://baike.baidu.com/item/关系型数据库/8999831 ↑
  2. https://www.jianshu.com/p/fd7b422d5f93 ↑
  3. https://www.runoob.com/mongodb/nosql.html ↑

相关推荐

SQL关联各种JOIN傻傻分不清楚,读这一篇就够了

在关系型数据库中支持多表关联,不同场景下通过不同join方式让分布在不同表中的数据呈现在同一个结果里。熟练使用sql联合查询是日常开发的基础工作。为了方便演示讲解,假设有两个表,一张是保存学生踢足球的...

MyBatis的SQL执行流程不清楚?看完这一篇就够了

推荐学习真香警告!Alibaba珍藏版mybatis手写文档,刷起来全网独家的“MySQL高级知识”集合,骨灰级收藏,手慢则无前言MyBatis可能很多人都一直在用,但是MyBatis的SQL执行...

SQL优化这十条,面试的时候你都答对了吗?

尽量不要在要给在SQL语句的where子句中使用函数,这样会使索引失效。如果已经确定查询结果只有一条数据(当表中数据的该字段是唯一的),在查询SQL末尾增加limit1,这样MySQL的查询执行引...

SQL查询Excel结果数据还可这样输出到窗体控件ListBox和ListView

上一期作品,我们分享了通过SQL查询Excel的结果数据输出到Excel自身的工作表区域。大家估计应该感觉到了SQL查询的强大功能,它对精确或模糊查询均无畏惧,优点是查询检索效率高,将查询结果输出的形...

数据库|SQLServer数据库:模糊查询的三种情况

哈喽,你好啊,我是雷工!就是字面意思,当数据库的查询条件并不是十分具体时就用到模糊查询,比如查询姓氏为雷的人名,就需要从姓名列模糊查询。01like关键字查询当使用like关键字进行查询时,字段中的...

数据库教程-SQL Server多条件模糊查询

表单查询是以数据存储管理为基础的信息管理系统各业务功能实现的基础,也是数据库CRUD操作的重点与难点,尤其是多表连接查询、条件查询、分组查询、聚合函数等的综合应用。本文以某一比赛样式要求为基础,对数据...

如何利用教育网站源码成功搭建在线教育网站

如今是一个信息化时代,人们都想接受各种各样的教育,在线教育也就因此发展了起来,并且逐渐成为了一种趋势。而成熟的在线教育网站皆是由高质量的教育网站源码搭建而成的。如何利用教育网站源码成功搭建在线教育网站...

宝塔搭建WordPress跨境电商外贸商城模板汉化woodmart7.5.1源码

大家好啊,欢迎来到web测评。本期给大家带来一套php开发的WoodmartV7.5.1汉化主题|跨境电商|外贸商城|产品展示网站模板WordPress主题,是wordpress开发的。上次是谁要的系...

小狐狸ChatGPT付费创作系统V2.4.7全开源版 (vue全开源端)

测试环境:Nginx1.20+PHP7.4+MySQL5.7本版本为官方的最新开源包对应V2.4.7版本,包含了前后端所有开源包,是目前最新全开源版本,需要二开的这部分朋友也有选择了,如果不需要二...

php宝塔搭建部署thinkphp红色大气装修公司官网php源码

大家好啊,欢迎来到web测评。本期给大家带来一套php开发的thinkphp红色大气装修公司官网源码,上次是谁要的系统项目啊,帮你找到了,还说不会搭建,让我帮忙录制一期教程,趁着今天有空,简单的录制测...

php宝塔搭建免登录积分商城系统php源码

大家好啊,欢迎来到web测评。本期给大家带来一套php开发的免登录积分商城系统php源码,上次是谁要的系统项目啊,帮你找到了,还说不会搭建,让我帮忙录制一期教程,趁着今天有空,简单的录制测试了一下,部...

零代码搭建接口收费平台——接口大师YesApi

主流的API接口收费模式目前各大API接口平台,采用的收费模式主可以分为:免费接口、免费试用、接口流量套餐、先充值后按量计费的模式。例如,聚合数据的API收费模式是:按接口流量套餐。例如身份证二要素...

php宝塔搭建部署实战抽奖系统开源php源码

大家好啊,我是测评君,欢迎来到web测评。本期给大家带来一套抽奖系统开源php源码。感兴趣的朋友可以自行下载学习。技术架构PHP5.4+nginx+mysql5.7+JS+CSS+...

【推荐】一款开源个人与企业私有化部署使用的在线知识库管理平台

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍zyplayer-doc是一款基于Java+Vue开源、专注于个人与企业私有化部署使用的在线知识库管...

网上的付费文档无法下载?这几个方法10秒搞定,任意免费复制

工作或者学习过程中,我们很多时候需要在网上找资料,但是想要的资料却要付费或者提示无法下载怎么办?别怕,这几个方法,让你10秒就能搞定付费文档,任意复制。1.打印界面复制遇到文档需要付费或者无法复制的...