• python模块之 Motor 异步pymongo


    一、介绍

    Motor 是一个用于在 Python 中操作 MongoDB 的异步驱动程序。它是基于 asyncio 库构建的,充分利用了异步编程的优势,使得在 Python 中进行 MongoDB 数据库操作更加高效和灵活

    1. 异步支持:Motor 使用 asyncio 库提供异步操作的能力。它可以与其他异步库和框架(如 aiohttp、Tornado 等)无缝集成,使得在异步环境中进行 MongoDB 操作更加方便。
    2. 高性能:Motor 利用异步编程的特性,能够并发执行多个数据库操作,提高了系统的吞吐量和响应速度。它能够有效地处理大量的并发请求,适用于高负载的应用场景。
    3. 易于使用:Motor 的 API 设计简洁明了,与官方的 PyMongo API 类似,因此对于熟悉 PyMongo 的开发者来说,上手 Motor 是相对容易的。它提供了大部分常用的 MongoDB 操作方法,如插入文档、查询文档、更新文档等,使得开发人员能够快速进行数据库操作。
    4. 与 asyncio 生态的集成:由于 Motor 是基于 asyncio 构建的,它可以与 asyncio 生态中的其他库和工具无缝集成。例如,可以将 Motor 与 aiohttp(用于构建异步 Web 服务器)一起使用,从而实现高性能的 Web 应用程序。
    二、安装
    pip install motor
    
    • 1
    三、基本使用
    import motor.motor_asyncio
    import asyncio
    
    async def main():
        client = motor.motor_asyncio.AsyncIOMotorClient('mongodb://localhost:27017')
        db = client['video']['aiqiyi']
        cursor = db.find()
        async for result in cursor:
            print(result)
        await cursor.close()
        client.close()
    
    
    asyncio.run(main())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    四、motor.motor_asyncio 属性及方法
    1. motor.motor_asyncio.AsyncIOMotorClient:用于创建异步MongoDB客户端对象
      client = motor.motor_asyncio.AsyncIOMotorClient('mongodb://localhost:27017')
      
      • 1
    2. client.get_database(name):获取指定名称的异步数据库对象
      database = client.get_database('mydatabase')
      database = client['mydatabase']
      
      • 1
      • 2
    3. client.list_database_names():异步获取当前MongoDB实例中所有数据库的名称列表
      database_names = await client.list_database_names()
      
      • 1
    4. client.close():关闭异步MongoDB客户端的连接。
    5. database.get_collection(name):获取指定名称的异步集合对象
      collection = database.get_collection('mycollection')
      collection = client['mycollection']
      collection = client['mydatabase']['mycollection']
      
      • 1
      • 2
      • 3
    6. database.list_collection_names():异步获取当前数据库中所有集合的名称列表
      collection_names = await db.list_collection_names()
      
      • 1
    7. database.command(command, **kwargs):异步执行指定的 MongoDB 命令,返回结果
      #参数 command 是一个字典,表示要执行的命令。可以通过关键字参数传递其他选项
      result = await db.command('ping')
      
      • 1
      • 2
    8. database.create_collection(name, **kwargs):异步创建一个新的集合。返回一个 AsyncIOMotorCollection 对象,表示新创建的集合
      #参数 name 是集合的名称。可以通过关键字参数传递其他选项,如 capped、size、max 等
      collection = await db.create_collection('newcollection', capped=True, size=10000)
      
      • 1
      • 2
    9. database.drop_collection(name_or_collection)异步删除指定名称的集合
      #参数 name_or_collection 可以是集合的名称或 AsyncIOMotorCollection 对象。
      await db.drop_collection('mycollection') 或 await db.drop_collection(collection)
      
      • 1
      • 2
    10. database.list_collection_names(filter=None, **kwargs) :返回一个包含集合名称的列表。
      #参数 filter 是一个字典,表示过滤条件。可以通过关键字参数传递其他选项。
      collection_names = await db.list_collection_names(filter={'name': {'$regex': '^my'}})
      
      • 1
      • 2
    11. database.create_index(collection, keys, **kwargs):异步在指定集合上创建索引
      '''
      collection:是一个 AsyncIOMotorCollection 对象。
      keys:是一个包含要创建索引的字段和排序方式的列表。可以通过关键字参数传递其他选项,如 unique、sparse 等。
      '''
      await db.create_index(collection, [('name', pymongo.ASCENDING)], unique=True)
      
      • 1
      • 2
      • 3
      • 4
      • 5
    12. collection.insert_one(document):异步插入一个文档到集合中
      await collection.insert_one({'name': 'John', 'age': 30})
      
      • 1
    13. collection.insert_many(documents):异步插入多个文档到集合中
      await collection.insert_many([{'name': 'John', 'age': 30}, {'name': 'Jane', 'age': 25}])
      
      • 1
    14. collection.find(filter):异步查询匹配给定过滤条件的文档。返回一个游标对象,可以使用async for循环遍历结果
      cursor = collection.find({'age': {'$gte': 30}})
      async for document in cursor:
          print(document)
      
      • 1
      • 2
      • 3
    15. collection.update_one(filter, update):异步更新匹配给定过滤条件的第一个文档
      await collection.update_one({'name': 'John'}, {'$set': {'age': 35}})
      
      • 1
    16. collection.update_many(filter, update):异步更新匹配给定过滤条件的所有文档
      await collection.update_many({'age': {'$gte': 30}}, {'$set': {'age': 40}})
      
      • 1
    17. collection.delete_one(filter):异步删除匹配给定过滤条件的第一个文档
      await collection.delete_one({'name': 'John'})
      
      • 1
    18. collection.delete_many(filter):异步删除匹配给定过滤条件的所有文档
      
      • 1
      await collection.delete_many({'age': {'$lt': 30}})
      
      • 1
    19. collection.count_documents(filter):异步计算匹配给定过滤条件的文档数量
      count = await collection.count_documents({'age': {'$gte': 30}})
      
      • 1
    20. collection.aggregate(pipeline):异步执行聚合操作,根据给定的聚合管道对文档进行处理。返回一个游标对象,可以使用async for循环遍历结果
      cursor = collection.aggregate([{'$group': {'_id': '$name', 'count': {'$sum': 1}}}])
      async for document in cursor:
          print(document)
      
      • 1
      • 2
      • 3
    21. collection.create_index(keys, options):异步创建索引,以提高查询性能
      await collection.create_index([('name', pymongo.ASCENDING)], unique=True)
      
      • 1
    22. collection.drop_index(name):异步删除指定名称的索引
      await collection.drop_index('index_name')
      
      • 1
    23. cursor.to_list(length=None):异步将游标中的所有文档转换为列表。参数 length 是可选的,用于限制返回的文档数量。返回一个包含所有文档的列表。documents = await cursor.to_list()
    24. cursor.next():异步获取游标中的下一个文档。返回下一个文档,如果游标已经遍历完毕,则返回 None。document = await cursor.next()
    25. cursor.count():异步获取游标中的文档数量。返回游标中的文档数量。count = await cursor.count()
    26. cursor.rewind():重置游标的位置,使其重新从查询结果的开头开始遍历。cursor.rewind()
    27. cursor.close():关闭游标,释放相关资源。await cursor.close()
    28. cursor.max_time_ms(milliseconds):设置查询的最大执行时间,以毫秒为单位。参数 milliseconds 是最大执行时间。示例:cursor.max_time_ms(500)
    29. cursor.batch_size(size):设置从服务器获取的每个批次的文档数量。参数 size 是每个批次的文档数量。示例:cursor.batch_size(100)
  • 相关阅读:
    含文档+PPT+源码等]精品微信小程序ssm驾校教培服务系统小程序+后台管理系统|前后分离VUE[包运行成功]微信小程序项目源码Java毕业设计
    QOS技术
    [Qt/C/C++]JSON和程序发布
    Mybatis-Plus复习
    452. 用最少数量的箭引爆气球
    Git rebase 用法说明
    【LeetCode刷题笔记】双指针
    关于git创建分支以及主分支相互合并操作记录
    计算机系统的层次结构
    智能运维和数字孪生赋能智慧城市管理服务平台
  • 原文地址:https://blog.csdn.net/randy521520/article/details/132714428