使用motor从mongo查询数据

motor 提供find_one方法从mongo的集合中查询出一条符合查询条件的数据,find方法则能够查询出所有符合查询条件的数据

1. find_one 查询一条数据

import pprint
import asyncio
import motor.motor_asyncio

uri = "mongodb://kwsy:123456@localhost:27017/app"
client = motor.motor_asyncio.AsyncIOMotorClient(uri)

db = client.app

async def do_find_one(db, query):
    document = await db.user.find_one(query)
    pprint.pprint(document)


loop = asyncio.get_event_loop()
loop.run_until_complete(do_find_one(db, {"age": 14}))

本示例中,我为协程函数do_find_one 增加了参数,分别传入db对象和查询条件,在使用run_until_complete方法执行协程时,可以通过传入参数修改查询条件。

程序执行结果

{'_id': ObjectId('6266826719838b5a3ccf7ae5'), 'age': 14, 'name': '小红'}

2. find 查询多个结果

find_one 只能返回一条符合查询条件的数据,而find方法可以返回所有符合查询条件的数据

import pprint
import asyncio
import motor.motor_asyncio

uri = "mongodb://kwsy:123456@localhost:27017/app"
client = motor.motor_asyncio.AsyncIOMotorClient(uri)

db = client.app

async def do_find(db, query):
    cursor = db.user.find(query)
    datas = await cursor.to_list(length=100)
    for data in datas:
        pprint.pprint(data)


loop = asyncio.get_event_loop()
loop.run_until_complete(do_find(db, {"age": {"$gte": 14}}))

to_list 方法要求必须提供length对象,这个方法会一次性返回最多length个数据,这些数据都会加载到内存中,因此才要求必须提供length, 提醒你注意数量,将集合里所有数据都加载到内存中是不合理的,遍历全部数据可以使用下面的方法

import pprint
import asyncio
import motor.motor_asyncio

uri = "mongodb://kwsy:123456@localhost:27017/app"
client = motor.motor_asyncio.AsyncIOMotorClient(uri)

db = client.app

async def do_find(db, query):
    cursor = db.user.find(query)
    async for data in cursor:
        pprint.pprint(data)


loop = asyncio.get_event_loop()
loop.run_until_complete(do_find(db, {"age": {"$gte": 14}}))

程序查询age大于等于14的文档, 程序输出结果

{'_id': ObjectId('6266826719838b5a3ccf7ae5'), 'age': 14, 'name': '小红'}
{'_id': ObjectId('626683be9c66e2bbe3d5ad49'), 'age': 14, 'name': '小红'}
{'_id': ObjectId('626683be9c66e2bbe3d5ad4a'), 'age': 15, 'name': '小明'}

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案