zoukankan      html  css  js  c++  java
  • 第四节--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=安装目录logmongo.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))
    
  • 相关阅读:
    IO和序列化
    委托与事件
    [基础不过关填坑] 跨iframe触发事件
    有哪些新手程序员不知道的小技巧?
    给echarts加个“全屏展示”
    bootstrapTable使用场景及方式
    bootstrap datetimepicker 格式化yyyymmdd时,无法读取yyyymmdd格式
    【变态需求】bootstrapTable列排序-选择正序倒序不排序
    myeclipse、maven、tomcat、jdk技巧和坑【待完善】
    【调试技巧】 Fiddler高级用法之url映射请求
  • 原文地址:https://www.cnblogs.com/LQ6H/p/10387900.html
Copyright © 2011-2022 走看看