数据存储之非关系型数据库存储----MongoDB存储

MongoDB存储----文档型数据库

  • 利用pymongo连接MongoDB

    import pymongo
    client = pymongo.MongoClient(host=‘localhost‘, port=27017)
    # 或 pymongo.MongoClient(‘mongodb://localhost:23017/‘)
    # 默认端口为:27017

    # pymongo.MongoClient()方法
  • 指定数据库

    # 指定操作test数据库# db = client.test 或 db = client[‘test‘]
    
  • 指定集合

    # 指定一个集合要操作的集合students# collection = db.students 或 collection = db[‘students‘]
    
  • 插入数据

    import pymongo
    
    # 连接MongoDB
    client = pymongo.MongoClient(host=‘localhost‘, port=27017)
    
    # 指定数据库
    db = client.test
    
    # 指定集合
    collection = db.students
    
    # 数据
    student = {
        ‘id‘: ‘20180001‘,
        ‘name‘: ‘Jordan‘,
        ‘age‘: 20,
        ‘gender‘: ‘male‘
    }
    
    # 利用insert_one()方法插入一条数据
    result = collection.insert_one(student)
    print(result)
    
    # 运行输出:<pymongo.results.InsertOneResult object at 0x11089b448>
    # 在MongoDB中,每条数据其实都有一个_id属性来唯一标识。如果没有显式指明该属性,MongoDB会自动产生一个ObjectId类型的_id属性。
    # 使用 insert_one()和 insert_many()方法来分别插入单条记录和多条记录

    插入单条数据

    import pymongo
    
    client = pymongo.MongoClient(host=‘localhost‘, port=27017)
    db = client.test
    collection = db.students
    
    student1 = {
        ‘id‘: ‘20180002‘,
        ‘name‘: ‘Lee Hua‘,
        ‘age‘: 20,
        ‘gender‘: ‘male‘
    }
    student2 = {
        ‘id‘: ‘20180003‘,
        ‘name‘: ‘Mike‘,
        ‘age‘: 21,
        ‘gender‘: ‘male‘
    }
    
    result = collection.insert_many([student1, student2])
    print(result)
    print(result.inserted_ids)
    # 调用inserted_ids属性可以获取数据的_id列表
    
    # 运行输出:
    <pymongo.results.InsertManyResult object at 0x110826d88>
    [ObjectId(‘5d28b293e834575faf929428‘), ObjectId(‘5d28b293e834575faf929429‘)]

    插入多条数据

    # insert_one()方法 和 insert_many()方法
    
  • 查询

    import pymongo
    
    client = pymongo.MongoClient(host=‘localhost‘, port=27017)
    db = client.test
    collection = db.students
    
    result = collection.find_one({‘name‘: ‘Lee Hua‘})
    print(result)
    
    # 输出:
    {‘_id‘: ObjectId(‘5d28b293e834575faf929428‘), ‘id‘: ‘20180002‘, ‘name‘: ‘Lee Hua‘, ‘age‘: 20, ‘gender‘: ‘male‘}

    查询单条数据

    import pymongo
    
    client = pymongo.MongoClient(host=‘localhost‘, port=27017)
    db = client.test
    collection = db.students
    
    result = collection.find()
    print(result)
    for r in result:
        print(r)
    
    # find()方法返回一个迭代器,用for循环逐条输出
    # 输出结果:
    <pymongo.cursor.Cursor object at 0x10e0f7320>
    {‘_id‘: ObjectId(‘5d28ae0360105a198d9d501a‘), ‘id‘: ‘20180001‘, ‘name‘: ‘Jordan‘, ‘age‘: 20, ‘gender‘: ‘male‘}
    {‘_id‘: ObjectId(‘5d28ae2d8b3d004feb604874‘), ‘id‘: ‘20180001‘, ‘name‘: ‘Jordan‘, ‘age‘: 20, ‘gender‘: ‘male‘}
    {‘_id‘: ObjectId(‘5d28b293e834575faf929428‘), ‘id‘: ‘20180002‘, ‘name‘: ‘Lee Hua‘, ‘age‘: 20, ‘gender‘: ‘male‘}
    {‘_id‘: ObjectId(‘5d28b293e834575faf929429‘), ‘id‘: ‘20180003‘, ‘name‘: ‘Mike‘, ‘age‘: 21, ‘gender‘: ‘male‘}

    查询多条数据

    # find_one()方法 和 find()方法

    可以在这两个方法里面添加条件,如:

    find(    {        ‘name‘: {‘$regex‘: ‘^M.*‘}    })这里查找的是以‘M‘开头的名字的那些数据,
    $regex指定的是正则表达式,
    ^M.*是一条正则表达式
    更多功能符号(如$regex)、数值比较符号的查看MongoDB官方文档:https://docs.mongodb.com/?searchProperty=manual
  • 计数

    import pymongo
    
    client = pymongo.MongoClient(host=‘localhost‘, port=27017)
    db = client.test
    collection = db.students
    
    count = collection.count_documents(
        {
            ‘id‘: {‘$regex‘: ‘^(2018)‘}
        }
    )
    print(count)
    
    # 输出id为2018开头的数据的条数

    # collection.count_documents({条件}) 方法
  • 排序

     1 import pymongo
     2
     3 client = pymongo.MongoClient(host=‘localhost‘, port=27017)
     4 db = client.test
     5 collection = db.students
     6
     7 result = collection.find().sort(‘id‘, pymongo.ASCENDING)
     8 for r in result:
     9     print(r)
    10
    11
    12 # 以id升序输出所有的数据:
    13 {‘_id‘: ObjectId(‘5d28ae0360105a198d9d501a‘), ‘id‘: ‘20180001‘, ‘name‘: ‘Jordan‘, ‘age‘: 20, ‘gender‘: ‘male‘}
    14 {‘_id‘: ObjectId(‘5d28ae2d8b3d004feb604874‘), ‘id‘: ‘20180001‘, ‘name‘: ‘Jordan‘, ‘age‘: 20, ‘gender‘: ‘male‘}
    15 {‘_id‘: ObjectId(‘5d28b293e834575faf929428‘), ‘id‘: ‘20180002‘, ‘name‘: ‘Lee Hua‘, ‘age‘: 20, ‘gender‘: ‘male‘}
    16 {‘_id‘: ObjectId(‘5d28b293e834575faf929429‘), ‘id‘: ‘20180003‘, ‘name‘: ‘Mike‘, ‘age‘: 21, ‘gender‘: ‘male‘}
    17
    18
    19 # sort()方法进行排序
    20 # pymongo.ASCENDING指定升序
    21 # pymongo.DESCENDING指定降序

    # sort()方法
    
  • 偏移

    import pymongo
    
    client = pymongo.MongoClient(host=‘localhost‘, port=27017)
    db = client.test
    collection = db.students
    
    results = collection.find().sort(‘id‘, pymongo.DESCENDING).skip(1)
    print(
        [
            result[‘id‘] for result in results
        ]
    )
    
    # 输出:
    [‘20180002‘, ‘20180001‘, ‘20180001‘]
    
    # skip(1)表示偏移1,即忽略前面一个元素

    skip()方法

    import pymongo
    
    client = pymongo.MongoClient(host=‘localhost‘, port=27017)
    db = client.test
    collection = db.students
    
    results = collection.find().sort(‘id‘, pymongo.DESCENDING).skip(1).limit(2)
    print(
        [
            result[‘id‘] for result in results
        ]
    )
    
    # 输出:
    [‘20180002‘, ‘20180001‘]
    
    # limit(2) 即表示限制输出的数据条数为两条

    limit()方法

    # 数据量很大时,不使用大的偏移量来查询数据
  • 更新

    import pymongo
    
    client = pymongo.MongoClient(host=‘localhost‘, port=27017)
    db = client[‘test‘]
    collection = db[‘students‘]
    
    # 查询条件:age >= 20
    query_condition = {
        ‘age‘: {‘$gte‘: 20}
    }
    
    # 更新条件:数据的age加1
    update_condition = {
        ‘$inc‘: {‘age‘: 1}
    }
    
    result = collection.update_one(query_condition, update_condition)
    print(result)
    print(result.matched_count, result.modified_count)
    
    # 输出:
    <pymongo.results.UpdateResult object at 0x110a11c88>
    1 1
    
    # 返回的结果是UpdateResul类型的
    # 调用matched_count属性,获得匹配数据的条数
    # 调用modified_count属性,获得影响数据的条数
    # $gte : 大于等于
    # $inc : 将字段递增指定的值
    # updata_one()更新与筛选器匹配的单个文档

    update_one()方法

    import pymongo
    
    client = pymongo.MongoClient(host=‘localhost‘, port=27017)
    db = client[‘test‘]
    collection = db[‘students‘]
    
    query_condition = {
        ‘age‘: {‘$gte‘: 20}
    }
    update_condition = {
        ‘$inc‘: {‘age‘: 1}
    }
    
    result = collection.update_many(query_condition, update_condition)
    print(result)
    print(result.matched_count, result.modified_count)
    
    # 输出:
    <pymongo.results.UpdateResult object at 0x111c84448>
    4 4

    update_many()方法

    # update_one()方法 和 update_many()方法
  • 删除

    import pymongo
    
    client = pymongo.MongoClient(host=‘localhost‘, port=27017)
    db = client[‘test‘]
    collection = db[‘students‘]
    
    result = collection.delete_one({‘age‘: 21})
    print(result.deleted_count)
    
    # delete_one()方法:删除第一条符合条件的数据
    # delete_count属性:获取删除数据的条数

    delete_one()方法

    import pymongo
    
    client = pymongo.MongoClient(host=‘localhost‘, port=27017)
    db = client[‘test‘]
    collection = db[‘students‘]
    
    result = collection.delete_many({‘age‘: 21})
    print(result.deleted_count)
    
    # delete_many()方法:删除所有符合条件的数据

    delete_many()方法

  • PyMongo的详细用法:http://api.mongodb.com/python/current/api/pymongo/collection.html

原文地址:https://www.cnblogs.com/liyihua/p/11179084.html

时间: 2024-10-25 17:11:27

数据存储之非关系型数据库存储----MongoDB存储的相关文章

大数据时代的数据存储,非关系型数据库MongoDB

在过去的很长一段时间中,关系型数据库(Relational Database Management System)一直是最主流的数据库解决方案,他运用真实世界中事物与关系来解释数据库中抽象的数据架构.然而,在信息技术爆炸式发展的今天,大数据已经成为了继云计算,物联网后新的技术革命,关系型数据库在处理大数据量时已经开始吃力,开发者只能通过不断地优化数据库来解决数据量的问题,但优化毕竟不是一个长期方案,所以人们提出了一种新的数据库解决方案来迎接大数据时代的到来——NoSQL(非关系型数据库). 为什

大数据时代的数据存储,非关系型数据库MongoDB(一)

爆炸式发展的NoSQL技术 在过去的很长一段时间中,关系型数据库(Relational Database Management System)一直是最主流的数据库解决方案,他运用真实世界中事物与关系来解释数据库中抽象的数据架构.然而,在信息技术爆炸式发展的今天,大数据已经成为了继云计算,物联网后新的技术革命,关系型数据库在处理大数据量时已经开始吃力,开发者只能通过不断地优化数据库来解决数据量的问题,但优化毕竟不是一个长期方案,所以人们提出了一种新的数据库解决方案来迎接大数据时代的到来——NoSQ

Python3网络爬虫实战-33、数据存储:非关系型数据库存储:MongoDB

NoSQL,全称 Not Only SQL,意为不仅仅是 SQL,泛指非关系型的数据库.NoSQL 是基于键值对的,而且不需要经过 SQL 层的解析,数据之间没有耦合性,性能非常高. 非关系型数据库又可以细分如下: 键值存储数据库,代表有 Redis, Voldemort, Oracle BDB 等. 列存储数据库,代表有 Cassandra, HBase, Riak 等. 文档型数据库,代表有 CouchDB, MongoDB 等. 图形数据库,代表有 Neo4J, InfoGrid, Inf

python爬虫11--文件存储之非关系型数据库存储MongoDB

NoSQL,Not Only SQL,不仅仅是SQL,泛指非关系型数据库,基于键值对的,不需要经过SQL层的解析,数据之间没有耦合性,性能高. 非关系型数据库细分如下: 键值存储数据库:Redis.Voldemort.Oracle BDB: 列表存储数据库:Cassandra.HBase.Riak: 文档型数据库:CouchDB.MongoDB: 图形数据库:Neo4j.InfoGrid.Infinite Graph. 爬虫数据使用非关系型数据库原因:简单高效.爬虫数据可能存在某些字段提取失败或

Python3网络爬虫实战-34、数据存储:非关系型数据库存储:Redis

Redis 是一个基于内存的高效的键值型非关系型数据库,存取效率极高,而且支持多种存储数据结构,使用也非常简单,在本节我们介绍一下 Python 的 Redis 操作,主要介绍 RedisPy 这个库的用法. 1. 准备工作 在本节开始之前请确保已经安装好了 Redis 及 RedisPy库,如果要做数据导入导出操作的话还需要安装 RedisDump,如没有安装可以参考第一章的安装说明. 2. Redis.StrictRedis RedisPy 库提供两个类 Redis 和 StrictRedi

mysql介绍(关系型数据库),关系型与非关系型数据库,数据库与文件的对应关系,mysql启动与连接,修改mysql配置信息

mysql介绍 数据库是用来存储数据的仓库本质就是存储数据的socket套接字c/s架构 数据库服务端: 存放数据库的主机集群数据库客户端: 可以连接数据库任意客户端数据库管理员:DBA 数据库的基本概念 mysql:关系型数据库 关系型与非关系型数据库 关系型数据库:Mysql access SQLServer Oracle 一般用来存储长期稳定的数据 1.有表的概念 2.以表中一条条记录存储数据 非关系型数据库 :Mongodb Redis Memcache 以键值对的方式存储,快速缓存,即

非关系型数据库redis-java基本操作

概述 redis是一个key-value的nosql数据库(非关系型数据库).支持存储的value类型包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.为了保证效率,数据都是缓存在内存中. redis执行语句 redis的命令:各种命令在这里 包下载 关于java操作redis的jar包可以使用Jed

非关系型数据库(NoSQL)——Redis安装及部署详解

在现在的互联网大潮中,NoSQL可谓是家喻户晓,Redis作为NoSQL中及其重要的一员,使我们走向架构道路的一条必经之路.作为运维工程师来说,是必须要掌握的! 既然提到了Redis数据库是非关系型数据,并且需要掌握Redis数据库.那么关于关系型数据库与非关系型数据库的基本概念是必须要了解的. 一.关系型数据库与非关系型数据库的基本概念: 数据库按照其结构可以分为关系型数据库与其他数据库,而这些其他数据库,我们统称为非关系型数据库. 1.关系型数据库 关系型数据库是一个结构化的数据库,创建在关

Python3编写网络爬虫12-数据存储方式五-非关系型数据库存储

非关系型数据库存储 NoSQL 全称 Not Only SQL 意为非SQL 泛指非关系型数据库.基于键值对 不需要经过SQL层解析 数据之间没有耦合性 性能非常高. 非关系型数据库可细分如下: 键值存储数据库: 代表有Redis.Voldemort.和Oracle BDB等. 列存储数据库:代表有Cassandra.HBase.和Riak等. 文档型数据库:代表有CouchDB.Mongodb等. 图形数据库:代表有Neo4J.InfoGrid.Infinite.Graph等. 对于爬虫的数据