• Python21天学习挑战赛Day(9)·操作MongoDB数据库



    活动地址:CSDN21天学习挑战赛

    ​一.安装pymongo库

            MongoDB数据库一篇全解

    pip install pymongo

    二.数据库操作

            1.连接数据库

    创建数据库连接需要使用MongoClient 对象,并且指定连接的ip地址,端口号,创建的数据库名

    1. from pymongo import MongoClient
    2. def mongodb_init01():
    3. """数据库连接方式1"""
    4. client = MongoClient(host='127.0.0.1', port=27017)
    5. print(client)
    6. def mongodb_init02():
    7. """数据库连接方式2"""
    8. uri = "mongodb://{}:{}".format('127.0.0.1', 27017)
    9. client = MongoClient(uri)
    10. print(client)
    11. if __name__ == '__main__':
    12. mongodb_init01()
    13. mongodb_init02()

    输出——

    1. MongoClient(host=['127.0.0.1:27017'], document_class=dict, tz_aware=False, connect=True)
    2. MongoClient(host=['127.0.0.1:27017'], document_class=dict, tz_aware=False, connect=True)

            2.数据库操作

    数据库的相关操作——

    ·查看所有数据库名称

    ·判断数据库是否存在

    ·使用现有数据库

    ·创建/删除数据库

    1. # 返回当前所有数据库名称
    2. databases_list = client.list_database_names()
    3. # 判断数据库是否存在
    4. if 'test001' in database_names:
    5. print("数据库已存在")
    6. else:
    7. print("数据库不存在")
    8. # 使用现有数据库(数据库名:test_database)
    9. test_database = client.test_database
    10. # 创建不存在的数据库并使用
    11. new_database = client.new_database
    12. # 删除现有数据库
    13. client.drop_database('new_database')

    注意:

    ·database_names在最新的版本Python中已经废弃,Python3.7以后的版本改为list_data_names().

    ·在MongoDB中,数据库只有在内容插入后才会创建。也就是说,数据库创建后要创建集合(数据表)并插入一个文档(记录),数据库才会真正创建。

            3.集合操作

    ·查看所有集合名称

    ·判断集合是否存在

    ·使用现有集合

    ·创建/删除集合

    1. # 查看当前数据库中的所有集合
    2. collection_names = new_database.list_collection_names()
    3. # 判断一个集合是否存在
    4. if 'test001' in collection_names:
    5. print("集合已存在")
    6. else:
    7. print("集合不存在")
    8. # 获取指定数据库下的所有集合对象
    9. collections = test_database.list_collections()
    10. for collection in collections:
    11. print('获取集合:', collection)
    12. # 使用一个已存在数集合(集合名称:test_collection)
    13. test_collection = new_database.test_collection
    14. # 创建一个新的集合
    15. new_collection = new_database.new_collection
    16. # 删除一个集合
    17. new_database.drop('new_collection')

    注意:

    ·collection_names在最新版本的Python中已经废弃,Python3.7以后版本为list_collection_names().

    ·在MongoDB中,集合只有在内容插入后才会创建。就是说,集合创建后要插入一个数据,集合才会真正创建。

            4.插入文档

    MongoDB中的一个文档类似SQL表的一条记录

            插入一个文档

    集合插入文档使用insert_one()方法,该方法的第一个参数是字典 name=>value 对

    1. from pymongo import MongoClient
    2. client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
    3. # 创建新的数据库
    4. new_database = client.new_database
    5. # 创建一个新的集合
    6. new_collection = new_database.new_collection
    7. # 使用insert_one插入一条数据
    8. x = new_collection.insert_one({"name": "张三", "age": 18})
    9. print(x) # 输出结果:

    打开可视化工具查看结果:

             插入多个文档

    集合插入多个文档使用 insert_many()方法,该方法的第一个参数就是字典列表。

    1. from pymongo import MongoClient
    2. client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
    3. # 创建新的数据库
    4. new_database = client.new_database
    5. # 创建一个新的集合
    6. new_collection = new_database.new_collection
    7. mylist = [
    8. {"name": "张飞", "hometown": "蜀国", "age": 30, "sex": "男"},
    9. {"name": "关羽", "hometown": "蜀国", "age": 40, "sex": "男"},
    10. {"name": "刘备", "hometown": "蜀国", "age": 50, "sex": "男"},
    11. {"name": "曹操", "hometown": "魏国", "age": 45, "sex": "男"},
    12. {"name": "司马懿", "hometown": "魏国", "age": 45, "sex": "男"},
    13. {"name": "孙权", "hometown": "吴国", "age": 50, "sex": "男"},
    14. {"name": "貂蝉", "hometown": "未知", "age": 18, "sex": "女"},
    15. {"name": "西施", "hometown": "越国", "age": 18, "sex": "女"},
    16. {"name": "王昭君", "hometown": "西汉", "age": 18, "sex": "女"},
    17. {"name": "杨玉环", "hometown": "唐朝", "age": 18, "sex": "女"}
    18. ]
    19. # 使用insert_many插入多条数据
    20. x = new_collection.insert_many(mylist)

             插入指定id的多个文档

    1. from pymongo import MongoClient
    2. client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
    3. # 创建新的数据库
    4. new_database = client.new_database
    5. # 创建一个新的集合
    6. new_collection1 = new_database.new_collection1
    7. mylist = [
    8. {"_id": 1, "name": "小红"},
    9. {"_id": 2, "name": "小黑"},
    10. {"_id": 3, "name": "小白"},
    11. {"_id": 4, "name": "小蓝"},
    12. {"_id": 5, "name": "小黄"}
    13. ]
    14. # 使用insert_many插入多条数据
    15. x = new_collection1.insert_many(mylist)
    16. # 输出插入的所有文档对应的 _id 值
    17. print(x.inserted_ids) # 输出结果:[1, 2, 3, 4, 5]

             5.查看文档

    MongoDB中使用了find()和find_one方法来查询集合中的数据,类似与SQL中的SELECT语句。

            查询一条数据

    find_one()

    1. from pymongo import MongoClient
    2. client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
    3. # 创建新的数据库
    4. new_database = client.new_database
    5. # 创建一个新的集合
    6. new_collection = new_database.new_collection
    7. x = new_collection.find_one()
    8. print(x)
    {'_id': ObjectId('6223413c927c6c0e82b9a4b0'), 'name': '张三', 'age': 18}
    

            查询集合所有数据

    find()

    1. from pymongo import MongoClient
    2. client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
    3. # 创建新的数据库
    4. new_database = client.new_database
    5. # 创建一个新的集合
    6. new_collection = new_database.new_collection
    7. for x in new_collection.find():
    8. print(x)
    1. {'_id': ObjectId('6223413c927c6c0e82b9a4b0'), 'name': '张三', 'age': 18}
    2. {'_id': ObjectId('6223436592276f5f7b639bed'), 'name': '张飞', 'hometown': '蜀国', 'age': 30, 'sex': '男'}
    3. {'_id': ObjectId('6223436592276f5f7b639bee'), 'name': '关羽', 'hometown': '蜀国', 'age': 40, 'sex': '男'}
    4. {'_id': ObjectId('6223436592276f5f7b639bef'), 'name': '刘备', 'hometown': '蜀国', 'age': 50, 'sex': '男'}
    5. {'_id': ObjectId('6223436592276f5f7b639bf0'), 'name': '曹操', 'hometown': '魏国', 'age': 45, 'sex': '男'}
    6. {'_id': ObjectId('6223436592276f5f7b639bf1'), 'name': '司马懿', 'hometown': '魏国', 'age': 45, 'sex': '男'}
    7. {'_id': ObjectId('6223436592276f5f7b639bf2'), 'name': '孙权', 'hometown': '吴国', 'age': 50, 'sex': '男'}
    8. {'_id': ObjectId('6223436592276f5f7b639bf3'), 'name': '貂蝉', 'hometown': '未知', 'age': 18, 'sex': '女'}
    9. {'_id': ObjectId('6223436592276f5f7b639bf4'), 'name': '西施', 'hometown': '越国', 'age': 18, 'sex': '女'}
    10. {'_id': ObjectId('6223436592276f5f7b639bf5'), 'name': '王昭君', 'hometown': '西汉', 'age': 18, 'sex': '女'}
    11. {'_id': ObjectId('6223436592276f5f7b639bf6'), 'name': '杨玉环', 'hometown': '唐朝', 'age': 18, 'sex': '女'}

            查询指定字段的数据

    可以使用find()方法查询指定字段数据,将要返回的字段对应值设置为1

    1. from pymongo import MongoClient
    2. client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
    3. # 创建新的数据库
    4. new_database = client.new_database
    5. # 创建一个新的集合
    6. new_collection = new_database.new_collection
    7. for x in new_collection.find({}, {"_id": 0, "name": 1}):
    8. print(x)
    1. {'name': '张三'}
    2. {'name': '张飞'}
    3. {'name': '关羽'}
    4. {'name': '刘备'}
    5. {'name': '曹操'}
    6. {'name': '司马懿'}
    7. {'name': '孙权'}
    8. {'name': '貂蝉'}
    9. {'name': '西施'}
    10. {'name': '王昭君'}
    11. {'name': '杨玉环'}

    注意:处理_id,你不能在一个对象中同时指定0和1,如果你设置了一个字段为0,则其它都为1,反之亦然。

            根据指定条件查询

    我们可以在find()中设置参数进行筛选

    例如:查看new_collection集合中age为18的数据
     

    1. from pymongo import MongoClient
    2. client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
    3. # 创建新的数据库
    4. new_database = client.new_database
    5. # 创建一个新的集合
    6. new_collection = new_database.new_collection
    7. myquery = {"age": 18}
    8. mydoc = new_collection.find(myquery)
    9. for x in mydoc:
    10. print(x)
    1. {'_id': ObjectId('6223413c927c6c0e82b9a4b0'), 'name': '张三', 'age': 18}
    2. {'_id': ObjectId('6223436592276f5f7b639bf3'), 'name': '貂蝉', 'hometown': '未知', 'age': 18, 'sex': '女'}
    3. {'_id': ObjectId('6223436592276f5f7b639bf4'), 'name': '西施', 'hometown': '越国', 'age': 18, 'sex': '女'}
    4. {'_id': ObjectId('6223436592276f5f7b639bf5'), 'name': '王昭君', 'hometown': '西汉', 'age': 18, 'sex': '女'}
    5. {'_id': ObjectId('6223436592276f5f7b639bf6'), 'name': '杨玉环', 'hometown': '唐朝', 'age': 18, 'sex': '女'}

                  高级查询

    查询的条件语句中,我们还可以使用修饰符

    如查看new_collection集合中age大于18的数据

    1. from pymongo import MongoClient
    2. client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
    3. # 创建新的数据库
    4. new_database = client.new_database
    5. # 创建一个新的集合
    6. new_collection = new_database.new_collection
    7. myquery = {"age": {"$gt": 18}}
    8. mydoc = new_collection.find(myquery)
    9. for x in mydoc:
    10. print(x)
    1. {'_id': ObjectId('6223436592276f5f7b639bed'), 'name': '张飞', 'hometown': '蜀国', 'age': 30, 'sex': '男'}
    2. {'_id': ObjectId('6223436592276f5f7b639bee'), 'name': '关羽', 'hometown': '蜀国', 'age': 40, 'sex': '男'}
    3. {'_id': ObjectId('6223436592276f5f7b639bef'), 'name': '刘备', 'hometown': '蜀国', 'age': 50, 'sex': '男'}
    4. {'_id': ObjectId('6223436592276f5f7b639bf0'), 'name': '曹操', 'hometown': '魏国', 'age': 45, 'sex': '男'}
    5. {'_id': ObjectId('6223436592276f5f7b639bf1'), 'name': '司马懿', 'hometown': '魏国', 'age': 45, 'sex': '男'}
    6. {'_id': ObjectId('6223436592276f5f7b639bf2'), 'name': '孙权', 'hometown': '吴国', 'age': 50, 'sex': '男'}

            使用正则表达式查询

    正则表达式修饰符只用于搜索字符串字段

    查看name以张开头的数据,{"$regex:""^张"}

    1. from pymongo import MongoClient
    2. client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
    3. # 创建新的数据库
    4. new_database = client.new_database
    5. # 创建一个新的集合
    6. new_collection = new_database.new_collection
    7. myquery = {"name": {"$regex": "^张"}}
    8. mydoc = new_collection.find(myquery)
    9. for x in mydoc:
    10. print(x)
    1. {'_id': ObjectId('6223413c927c6c0e82b9a4b0'), 'name': '张三', 'age': 18}
    2. {'_id': ObjectId('6223436592276f5f7b639bed'), 'name': '张飞', 'hometown': '蜀国', 'age': 30, 'sex': '男'}

            返回指定条数记录

    limit()方法

    如返回三条文档记录

    1. from pymongo import MongoClient
    2. client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
    3. # 创建新的数据库
    4. new_database = client.new_database
    5. # 创建一个新的集合
    6. new_collection = new_database.new_collection
    7. myresult = new_collection.find().limit(3)
    8. # 输出结果
    9. for x in myresult:
    10. print(x)
    1. {'_id': ObjectId('6223413c927c6c0e82b9a4b0'), 'name': '张三', 'age': 18}
    2. {'_id': ObjectId('6223436592276f5f7b639bed'), 'name': '张飞', 'hometown': '蜀国', 'age': 30, 'sex': '男'}
    3. {'_id': ObjectId('6223436592276f5f7b639bee'), 'name': '关羽', 'hometown': '蜀国', 'age': 40, 'sex': '男'}

      6.修改文档

            修改一条

    updata_one()方法,第一个参数为查阅的条件,第二个参数为要修改的字段,如查找到的匹配数据多余一条,只会修改第一条

    1. from pymongo import MongoClient
    2. client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
    3. # 创建新的数据库
    4. new_database = client.new_database
    5. # 创建一个新的集合
    6. new_collection = new_database.new_collection
    7. myquery = {"name": "张三"}
    8. newvalues = {"$set": {"name": "张三三"}}
    9. new_collection.update_one(myquery, newvalues)

            修改全部 

    updata_many()

    1. from pymongo import MongoClient
    2. client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
    3. # 创建新的数据库
    4. new_database = client.new_database
    5. # 创建一个新的集合
    6. new_collection = new_database.new_collection
    7. myquery = {"name": {"$regex": "^张"}}
    8. newvalues = {"$set": {"name": "李好啊"}}
    9. new_collection.update_many(myquery, newvalues)

     7.删除数据

            输出一个文档

    delete_one()删除一个文档,第一个参数为查询对象,指定要删除的数据

    1. from pymongo import MongoClient
    2. client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
    3. # 创建新的数据库
    4. new_database = client.new_database
    5. # 创建一个新的集合
    6. new_collection = new_database.new_collection
    7. myquery = {"name": "关羽"}
    8. new_collection.delete_one(myquery)
    9. # 删除后输出
    10. for x in new_collection.find():
    11. print(x)
    1. {'_id': ObjectId('6223413c927c6c0e82b9a4b0'), 'name': '李好啊', 'age': 18}
    2. {'_id': ObjectId('6223436592276f5f7b639bed'), 'name': '李好啊', 'hometown': '蜀国', 'age': 30, 'sex': '男'}
    3. {'_id': ObjectId('6223436592276f5f7b639bef'), 'name': '刘备', 'hometown': '蜀国', 'age': 50, 'sex': '男'}
    4. {'_id': ObjectId('6223436592276f5f7b639bf0'), 'name': '曹操', 'hometown': '魏国', 'age': 45, 'sex': '男'}
    5. {'_id': ObjectId('6223436592276f5f7b639bf1'), 'name': '司马懿', 'hometown': '魏国', 'age': 45, 'sex': '男'}
    6. {'_id': ObjectId('6223436592276f5f7b639bf2'), 'name': '孙权', 'hometown': '吴国', 'age': 50, 'sex': '男'}
    7. {'_id': ObjectId('6223436592276f5f7b639bf3'), 'name': '貂蝉', 'hometown': '未知', 'age': 18, 'sex': '女'}
    8. {'_id': ObjectId('6223436592276f5f7b639bf4'), 'name': '西施', 'hometown': '越国', 'age': 18, 'sex': '女'}
    9. {'_id': ObjectId('6223436592276f5f7b639bf5'), 'name': '王昭君', 'hometown': '西汉', 'age': 18, 'sex': '女'}
    10. {'_id': ObjectId('6223436592276f5f7b639bf6'), 'name': '杨玉环', 'hometown': '唐朝', 'age': 18, 'sex': '女'}

            删除多个文档

    delete_many()

    如删除所有name字段中以 李 字开头的文档

    1. from pymongo import MongoClient
    2. client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
    3. # 创建新的数据库
    4. new_database = client.new_database
    5. # 创建一个新的集合
    6. new_collection = new_database.new_collection
    7. myquery = {"name": {"$regex": "^李"}}
    8. x = new_collection.delete_many(myquery)
    9. print(x.deleted_count, "个文档已删除")
    10. # 删除后输出
    11. for x in new_collection.find():
    12. print(x)
    1. 2 个文档已删除
    2. {'_id': ObjectId('6223436592276f5f7b639bef'), 'name': '刘备', 'hometown': '蜀国', 'age': 50, 'sex': '男'}
    3. {'_id': ObjectId('6223436592276f5f7b639bf0'), 'name': '曹操', 'hometown': '魏国', 'age': 45, 'sex': '男'}
    4. {'_id': ObjectId('6223436592276f5f7b639bf1'), 'name': '司马懿', 'hometown': '魏国', 'age': 45, 'sex': '男'}
    5. {'_id': ObjectId('6223436592276f5f7b639bf2'), 'name': '孙权', 'hometown': '吴国', 'age': 50, 'sex': '男'}
    6. {'_id': ObjectId('6223436592276f5f7b639bf3'), 'name': '貂蝉', 'hometown': '未知', 'age': 18, 'sex': '女'}
    7. {'_id': ObjectId('6223436592276f5f7b639bf4'), 'name': '西施', 'hometown': '越国', 'age': 18, 'sex': '女'}
    8. {'_id': ObjectId('6223436592276f5f7b639bf5'), 'name': '王昭君', 'hometown': '西汉', 'age': 18, 'sex': '女'}
    9. {'_id': ObjectId('6223436592276f5f7b639bf6'), 'name': '杨玉环', 'hometown': '唐朝', 'age': 18, 'sex': '女'}

            删除集合中所有文档

    delete_many传入空的查询则删除所有文档

    1. from pymongo import MongoClient
    2. client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
    3. # 创建新的数据库
    4. new_database = client.new_database
    5. # 创建一个新的集合
    6. new_collection = new_database.new_collection
    7. x = new_collection.delete_many({})
    8. print(x.deleted_count, "个文档已删除")
    9. # 删除后输出
    10. for x in new_collection.find():
    11. print(x)

            删除集合

    drop()方法

    1. from pymongo import MongoClient
    2. client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
    3. # 创建新的数据库
    4. new_database = client.new_database
    5. # 创建一个新的集合
    6. new_collection = new_database.new_collection
    7. new_collection.drop()

    8.排序

    sort方法第一个参数为要排序字段,第二个指定排序规则,为升序,-1为降序,默认升序

            升序

    1. from pymongo import MongoClient
    2. client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
    3. # 创建新的数据库
    4. new_database = client.new_database
    5. # 创建一个新的集合
    6. new_collection = new_database.new_collection
    7. mylist = [
    8. {"name": "张飞", "hometown": "蜀国", "age": 30, "sex": "男"},
    9. {"name": "关羽", "hometown": "蜀国", "age": 40, "sex": "男"},
    10. {"name": "刘备", "hometown": "蜀国", "age": 50, "sex": "男"}
    11. ]
    12. # 使用insert_many插入多条数据
    13. x = new_collection.insert_many(mylist)
    14. mydoc = new_collection.find().sort("name")
    15. for x in mydoc:
    16. print(x)

            降序

    1. from pymongo import MongoClient
    2. client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
    3. # 创建新的数据库
    4. new_database = client.new_database
    5. # 创建一个新的集合
    6. new_collection = new_database.new_collection
    7. mydoc = new_collection.find().sort("age", -1)
    8. for x in mydoc:
    9. print(x)

  • 相关阅读:
    LeetCode 双周赛 104(2023/05/13)流水的动态规划,铁打的结构化思考
    Java二阶知识点总结(二)Spring与SpringBoot
    苹果mac电脑文件读取没有访问权限如何解决?
    【store商城项目01】环境准备以及测试
    私有化轻量级持续集成部署方案--05-持续部署服务-Drone(上)
    HTML流星雨
    Java学习 8.Java-递归
    SOLR分组聚合的相关技巧
    虚拟机配置centos7网络
    用Rust写一个链表,非常详细,一遍看懂
  • 原文地址:https://blog.csdn.net/weixin_62599885/article/details/126259410