注册

详解MongoDB的update_one()函数:更新集合中的一个文档

MongoDB的update_one()函数介绍

MongoDB中的update_one()函数是用于更新文档中的一条记录。它只会更新符合筛选条件的第一条记录,即使有多条记录符合筛选条件。

update_one()函数的语法格式如下:

collection.update_one(filter, update, upsert=False, bypass_document_validation=False)

其中,filter参数用于指定筛选条件,update参数用于指定要更新的值。

update_one()函数使用方法的完整攻略

我们来看一下update_one()函数的完整使用攻略:

步骤1:导入pymongo模块

import pymongo

步骤2:连接MongoDB数据库

client = pymongo.MongoClient("mongodb://localhost:27017/")

步骤3:选择数据库和集合

db = client['mydatabase']
collection = db['mycollection']

步骤4:设置要更新的筛选条件和更新内容

myquery = { "name": "John" }
newvalues = { "$set": { "address": "Canyon 123" } }

步骤5:使用update_one()函数更新数据

result = collection.update_one(myquery, newvalues)
print(result.modified_count, "记录已修改")

如果找到了符合条件的记录,必须使用$set操作符来指定要更新的字段和值,否则将会把整个记录替换掉。更新结果会返回一个UpdateResult对象,该对象包含更新的状态信息。

在实际应用中,我们可以在条件不满足时插入一个新的文档设置为True(upsert=True),或者在修改文档时忽略文档校验。下面是一个包含了这些参数的update_one()函数的完整写法示例:

myquery = { "name": "John" }
newvalues = { "$set": { "address": "Canyon 123" } }
result = collection.update_one(myquery, newvalues, upsert=True, bypass_document_validation=True)
print(result.modified_count, "记录已修改")

实例演示:

假如我们有一个mycollection集合,内部包含着以下文档:

{ "_id": 1, "name": "Jack", "age": 20, "city": "Shanghai" }
{ "_id": 2, "name": "Tony", "age": 19, "city": "Shanghai" }
{ "_id": 3, "name": "John", "age": 22, "city": "Beijing" }
{ "_id": 4, "name": "David", "age": 19, "city": "Shanghai" }

示例一

现在,我们想要将name为John的文档的address从NULL更新为Shanghai,可以这样写:

myquery = { "name": "John" }
newvalues = { "$set": { "address": "Shanghai" } }
result = collection.update_one(myquery, newvalues)
print(result.modified_count, "记录已修改")

运行结果为:

1 记录已修改

此时,mycollection的文档已经变成了:

{ "_id": 1, "name": "Jack", "age": 20, "city": "Shanghai" }
{ "_id": 2, "name": "Tony", "age": 19, "city": "Shanghai" }
{ "_id": 3, "name": "John", "age": 22, "city": "Beijing", "address": "Shanghai" }
{ "_id": 4, "name": "David", "age": 19, "city": "Shanghai" }

可以看到,前三个字段与原记录一致,只是在第三条记录中添加了一个新的address字段。

示例二

假设我们现在要将年龄为19的人的年龄全部修改为20,可以这样写:

myquery = { "age": 19 }
newvalues = { "$set": { "age": 20 } }
result = collection.update_one(myquery, newvalues)
print(result.modified_count, "记录已修改")

运行结果为:

1 记录已修改

此时,mycollection的文档已经变成了:

{ "_id": 1, "name": "Jack", "age": 20, "city": "Shanghai" }
{ "_id": 2, "name": "Tony", "age": 19, "city": "Shanghai" }
{ "_id": 3, "name": "John", "age": 22, "city": "Beijing", "address": "Shanghai" }
{ "_id": 4, "name": "David", "age": 20, "city": "Shanghai" }

可以看到,符合条件的文档中只有一条被修改了,而其他的文档都保持不变。