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

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

技术教程gslnedu2025-02-20 14:30:4110A+A-

摘要:

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

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

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

db.collection.update(
   ,
   ,
   {
     upsert: ,
     multi: ,
     writeConcern: 
   }
)

#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 ↑
点击这里复制本文地址 以上内容由朽木教程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

朽木教程网 © All Rights Reserved.  蜀ICP备2024111239号-8