MongoEngine - 原子操作更新



原子性是ACID事务属性之一。数据库事务必须是不可分割且不可约分的,以便它要么完全发生,要么根本不发生。此属性称为原子性。MongoDB 仅支持单文档的原子性,而不支持多文档事务。

MongoEngine 提供以下方法用于对 QuerySet 进行原子更新。

update_one() − 覆盖或添加查询匹配到的第一个文档。

update() − 对查询匹配到的字段执行原子更新。

modify() − 更新文档并返回它。

可以使用以下修饰符与这些方法一起使用。(这些修饰符位于字段之前,而不是之后)。

set 设置特定值
unset 删除特定值
inc 将值增加给定数量
dec 将值减少给定数量
push 将值添加到列表中
push_all 将多个值添加到列表中
pop 根据值移除列表中的第一个或最后一个元素
pull 从列表中移除值
pull_all 从列表中移除多个值
add_to_set 仅当值不在列表中时才将其添加到列表中

以下是一个原子更新的示例,我们首先创建一个名为 tests 的文档类并在其中添加一个文档。

from mongoengine import *
con=connect('newdb')

class tests (Document):
   name=StringField()
   attempts=IntField()
   scores=ListField(IntField())

t1=tests()
t1.name='XYZ'
t1.attempts=0
t1.scores=[]
t1.save()

让我们使用 update_one() 方法将 name 字段从 XYZ 更新为 MongoDB。

tests.objects(name='XYZ').update_one(set__name='MongoDB')

push 修饰符用于向 ListField (scores) 中添加数据。

tests.objects(name='MongoDB').update_one(push__scores=50)

要将 attempts 字段加 1,可以使用 inc 修饰符。

tests.objects(name='MongoDB').update_one(inc__attempts=1)

更新后的文档如下所示:

{
"_id":{"$oid":"5ebcf8d353a48858e01ced04"},
"name":"MongoDB",
"attempts":{"$numberInt":"1"},
"scores":[{"$numberInt":"50"}]
}
广告