MongoEngine - 原子更新
原子性是 ACID 事务属性之一。 数据库事务必须是不可分割和不可简化的,以便它要么完全发生,要么根本不发生。 这个属性叫做原子性。 MongoDB 仅在单个文档上支持原子性,而不在多文档事务上支持。
MongoEngine 为查询集上的原子更新提供了以下方法。
update_one() − 覆盖或添加第一个与查询匹配的文档。
update() − 对查询匹配的字段执行原子更新。
modify() − 更新文档并将其返回。
以下修饰符可以与这些方法一起使用。 (这些修饰符出现在字段之前,而不是之后)。
set | 设置一个特定的值 |
unset | 删除一个特定值 |
inc | 将一个值增加给定的数量 |
dec | 按给定数量减少一个值 |
push | 向列表附加一个值 |
push_all | 将多个值附加到列表 |
pop | 根据值删除列表的第一个或最后一个元素 |
pull | 从列表中删除一个值 |
pull_all | 从列表中删除多个值 |
add_to_set | 仅当列表中不存在时才向列表中添加值 |
下面是一个原子更新的例子,我们首先创建一个名为tests的Document类,并在其中添加一个文档。
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() 方法将名称字段从 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"}] }