第四节--MongoDB数据库操作

第四节–MongoDB数据库操作

一.MongoDB介绍

MongoDB是一种基于分布式文件存储的数据库,有c++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB是介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能最丰富,最像关系数据库的数据库

MongoDB支持的数据结构非常松散,类似于JSONBSON格式,因此可以存储比较复杂的数据类型。MongoDB最大的特点是支持的查询语言非常强大,其语法有点类似面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引

MongoDB的特点是高性能,易部署,易使用,存储数据非常方便。主要功能特性有:

  1. 面向集合存储,易存储对象类型的数据
  2. 模式自由
  3. 支持动态查询
  4. 支持完全索引,包含内部对象
  5. 支持查询
  6. 使用高效的二进制数据存储,包括大型对象(如视频等)
  7. 自动处理碎片,以支持云计算层次的扩展性
  8. 支持Ruby,python,Java,C++,PHP,C#等多种语言
  9. 文件存储格式为BSON(一种JSON的扩展)
  10. 支持复制和故障恢复
  11. 可通过网络访问

所谓面向集合(Collection-Oriented),意思是数据被分组存储在数据集中,被称为一个集合(Collection)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系数据库(RDBMS)里的表(Table),不同的是MongoDB不需要定义任何模式(Schema),具有闪存高速缓存算法,能够快速识别数据内大数据集中的热数据,提供一致的性能改进

模式自由(Schema-Free),意味着对于存储在MongoDB数据库中的文件,不需要知道它的任何结构定义。如果需要,完全可以把不同结构的文件存储在同一个数据库里

存储在集合中的文档被存储为键–值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各种复杂的文件类型。我们称这种存储形式为BSON(Binary Serialized Document Format)

MongoDB已经在多个站点部署,其主要场景如下:

  1. 网站实时数据处理。非常适合实时地添加,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性
  2. 缓存。由于性能很高,因此适合作为信息基础设施的缓存层。在系统重启之后,由它搭建的持久性缓存层可以避免下层的数据源过载
  3. 高伸缩性的场景。非常适合由数十或数百台服务器组成的数据库,它的路线图中已经包含对MapReduce引擎的内置支持

二.安装及使用

使用python操作MongoDB需要搭建开发环境,介绍Windows下搭建python+MongoDB环境配置、配置环境需安装MongoDB,MongoDB可视化工具和python操作MongoDB模块

1.MongoDB

MongoDB的安装包可在官方网站下载社区版(www.mongodb.com/download-center#community)

安装完成后,在该目录下新建文件夹data和log,分别用于存放数据库文件和log日志文件,再创建一个mongo.conf配置文件

打开新创建的mongo.conf,输入以下代码:

# 数据库文件路径
dbpath=安装目录\data
# 日志输出文件路径
logpath=安装目录\log\mongo.log

写入配置信息后保存关闭文件,然后打开CMD窗口(终端),路径切换到安装目录下的bin目录,依次输入以下命令:

mongod --config "配置文件mongo.conf绝对路径" --install --serviceName "MongoDB"

net start MongoDB

以上命令代表将MongoDB数据库服务器添加到Windows服务,这样可免去每次手动开启MongoDB

完全配置设置后,在浏览器输入http://127.0.0.1:27017验证配置是否成功,出现下图内容则说明配置成功
1550293607670.png

2.MongoDB可视化工具

可视化工具可帮助使用者快速查看数据库的使用情况,MongoDB常用的可视化工具有RoboMongoMongoBooster

RoboMongo使用为例,官方网站下载地址

DocumentBSON格式,类似于JSON

1550293975011.png

3.创建数据库过程说明

  1. 右击"localhost(4)",单击"Create Database",将数据库命名为"DB"
  2. 打开数据库"DB",右击"Collections",选择"Create Collection",命名为"user"。新建的user称为集合,相当于关系数据库里面的数据表
  3. 右击"user",选择"Insert Document"。Document代表文档内容,相当于MySQL里数据表中的数据
  4. 集合user里有文件夹"Indexes",用于实现集合的索引功能;文件夹"Functions"用于实现脚本功能;在"Users"中设定用户账号密码,用于设置访问权限

4.PyMongo

PyMongo是python操作MongoDB的第三方库,有庞大的社区,功能较为稳定和完善。建议使用pip安装PyMongo

三.连接数据库

使用python实现对MongoDB操作的原理与连接关系式数据库一样:连接数据库-->访问数据表(集合)-->增删改查

python连接MongoDB主要有PyMongo实现,连接代码如下:

import pymongo
# 创建对象,连接本地数据库
# 方法一
client=pymongo.MongoClient()
# 方法二
client=pymongo.MongoClient('localhost',27017)
# 方法三
client=MongoClient('mongodb://localhost:27017/')
# 连接DB数据库
db=client['DB']
# 连接集合user,集合类似关系数据库的数据表
# 如果集合不存在,就会新建集合user
user_collection=db.user
# 设置文档格式(文档即我们常说的数据)

代码使用三种方法创建数据库(client)对象,localhost是数据库IP地址,27017是数据库端口,db=client['DB']指向需要连接的数据库,user_collection=db.user指向user集合(相当于关系数据库的数据表)

如果数据库设置了用户验证,在连接命令上要添加验证信息:

import pymongo
# 用户验证方法一
client=pymongo.MongoClient()
db_auth=client.admin
db_auth.authenticate(username,password)
# 连接DB数据库
db=client['DB']
# 用户验证方法二
client=Mongoclient('mongodb://username:password@localhost:27017/')
# 连接DB数据库
db=client['DB']

四.添加文档

MongoDB中,常用的操作有添加文档,更新文档,删除文档和查询文档。文档的数据结构和JSON基本一样。所有存储在集合中的数据都是BSON格式。BSON是一种类似JSON的二进制形式的存储格式,简称Binary JSON

文档添加方式分别有单条添加和批量添加,实现代码如下:

import pymongo
import datetime
import re

# 创建对象
client=pymongo.MongoClient()
# 连接DB数据库
db=client['DB']
# 连接集合user,集合类似关系数据库的数据表
# 如果集合不存在,就会新建集合user
user_colletction=db.user
# 设置文档格式(文档即我们常说的数据)
user_info={
    "_id":100,
    "author":"小黄",
    "text":"python爬虫开发",
    "tags":["mongodb","python","pymongo"],
    "date":datetime.datetime.utcnow()
}

# 使用insert_one单条添加文档,inserted_id获取写入后的id
# 添加文档时,如果文档尚未包含"_id"键,就会自动添加"_id"。"_id"的值在集合中必须是唯一的
# inserted_id用于获取添加后的id,若不需要,则可以去掉
user_id=user_colletction.insert_one(user_info).inserted_id
print("user id is",user_id)

# 批量添加
user_infos=[
    {
        "_id":101,
        "author":"小黄",
        "text":"python爬虫开发",
        "tags":["mongodb","python","pymongo"],
        "date":datetime.datetime.utcnow()
    },
    {
        "_id":102,
        "author":"小黄_A",
        "text":"python爬虫开发_A",
        "tags":{"db":"mongodb","lan":"python","model""pymongo"},
        "date":datetime.datetime.utcnow()
    }
]
# inserted_ids用于获取添加后的id,若不需要,则可以直接去掉
user_id=user_collection.insert_many(user_infos).inserted_ids
print("user is id",user_id)

1550298702431.png

五.更新文档

更新文档同样分为单条更新和批量更新,分别由update()update_many()实现。文档更新需要加入操作符。操作符的作用:通常文档只会有一部分要更新,利用原子的更新更新修改器可以使得更新极为高效。所谓原子操作,就是要么将这个文档保存到MongoDB,要么没有保存到MongoDB,不会出现查询到的文档没有保存完整的情况

下面介绍常用的更新操作符:

  • $set:用来指定一个键的值。如果这个键不存在,就创建它;如果存在,就执行更新
  • $unset:从文档中移除指定的键
  • $inc:修改器用来增加已有键的值,或者在键不存在时创建一个键。$inc就是专门来增加(或减少)数字的
  • $rename:操作符可以重命名字段名称,新的字段名称不能和文档中现有的字段名相同
  • $push:如果指定的键已经存在,就会向已有的数组末尾加入一个元素;如果指定的键不存在,就会创建一个新的数组
# 更新单条文档
# update(筛选条件,更新内容)。筛选条件为空,默认更新第一条文档
user_collection.update(
	{},
	{"$set":{"author":"小黄","text":"python爬虫"}}
)# 批量更新文档,只要将方法update改为update_many即可

方法update有两个参数,皆为字典格式:第一个字典为筛选条件,若为空,则默认更新第一条文档;第二个字典以操作符为字典的键,更新的内容以字典格式作为字典的值

六.查询文档

查询文档是使用find()方法产生一个查询来从MongoDB的集合中查询到数据。该方法与其他方法的使用大致相同,使用方法如下:

# 查询文档,find({"_id":101}),其中{"_id":101}为查询条件,若查询条件为空,则默认查询全部
find_value=user_collection.find({"_id":101})
print(list(find_value))

如果要实现多条件查询,就需要使用查询操作符:$and$or,使用方法如下:

# and条件查询
find_value=user_colletction.find(
    {
        "$and":[{"_id":101},{"Author":"小黄"}]
    }
)
print(list(find_value))
# or条件查询
find_value=user_collection.find(
    {
        "$or":[{"author":"小黄_A"},{"author":"小黄"}]
    }
)
print(list(find_value))

方法find()传递字典作为查询条件,操作符$and$or作为字典的键,字典的值是列表格式的,列表中的元素以字典形式表示,一个元素代表一个查询条件

如果要实现大于,小于或者不等于这类比较查询,就需要使用比较查询操作符:$lt(小于)$lte(小于或等于)$gt(大于)$gte(大于或等于)$in(in,符合范围内)$nin(not in,范围之外)

# 如查找id>100而<102,即_id=101的文档
find_value=user_collection.find(
    {
        "_id":{"$gt":100,"$lt":102}
    }
)
print(list(find_value))
# 查找id在[100,101]
find_value=user_collection.find(
    {
        "_id":{"$in":[100,101]}
    }
)
print(list(find_value))

比较查询和多条件查询存在明显的差别:

  1. 多条件查询以操作符为字典的键,比较查询以字段为字典的键
  2. 多条件查询的值是列表格式的,比较查询的值是字典格式的

如果使用两者组成一个查询,代码如下:

find_value=user_collection.find(
    {
        "$and":[{"_id":{"$gt":100,"$lt":102},{"_id":{"$in":[100,101]}}}]
    }
)
print(list(find_value))

当查询条件不明确某个值的时候,可以使用模糊匹配进行查询。在MongoDB中实现模糊匹配需要引用正则表达式,代码如下:

# 模糊查询实际上是加入正则表达式实现
# 方法1
find_value=user_colletction.find(
    {
        "author":{"$regex":".*小.*"}
    }
)
print(list(find_value))

# 方法2
regex=re.compile(".*小.*")
find_value=user_collection.find(
    {
        "author":regex
    }
)
print(list(find_value))
posted @ 2019-02-16 15:22  LQ6H  阅读(378)  评论(0编辑  收藏  举报