motor 提供了do_replace 和 update_one 两种方法来更新文档,do_replace 会使用新的文档完全替换掉旧的文档,而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_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}
与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}
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