使用motor更新mongo数据

motor 提供了do_replace 和 update_one 两种方法来更新文档,do_replace 会使用新的文档完全替换掉旧的文档,而update_one 则可以更新文档的一部分

1. replace_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
user = db.user

async def do_replace_one():
    result = await user.replace_one({'name': '小红'}, {'name': '小红', 'age': 14, 'score': 100})
    print('replaced %s document' % result.modified_count)

    cursor = user.find({'name': '小红'})
    datas = await cursor.to_list(length=100)
    for data in datas:
        print(data)


loop = asyncio.get_event_loop()
loop.run_until_complete(do_replace_one())

replace_one 有两个参数,第一个参数设置查询条件,第二个参数用来替换根据查询条件查出来的第一个数据,我的collection里有两个name 是 小红的数据,但只能替换其中的一个,程序输出结果

replaced 1 document
{'_id': ObjectId('6266826719838b5a3ccf7ae5'), 'name': '小红', 'age': 14, 'score': 100}
{'_id': ObjectId('626683be9c66e2bbe3d5ad49'), 'name': '小红', 'age': 14}

2. update_one

与replace_one 相比,update_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
user = db.user

async def do_update_one():
    result = await user.update_one({'name': '小明'}, {'$set': {'name': '小明2', 'score': 99}})
    print('replaced %s document' % result.modified_count)

    cursor = user.find({'name': '小明2'})
    datas = await cursor.to_list(length=100)
    for data in datas:
        print(data)


loop = asyncio.get_event_loop()
loop.run_until_complete(do_update_one())

程序输出结果

replaced 1 document
{'_id': ObjectId('626683be9c66e2bbe3d5ad4a'), 'name': '小明2', 'age': 15, 'score': 99}

3. update_many

update_many 方法可以批量修改数据,所有符合查询条件的数据都将被修改

import pprint
import asyncio
import motor.motor_asyncio

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

db = client.app
user = db.user

async def do_update_many():
    result = await user.update_many({}, {'$set': {'age': 16}})
    print('replaced %s document' % result.modified_count)

    cursor = user.find({})
    datas = await cursor.to_list(length=100)
    for data in datas:
        print(data)


loop = asyncio.get_event_loop()
loop.run_until_complete(do_update_many())

扫描关注, 与我技术互动

QQ交流群: 211426309

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

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