Mongoengine 简明教程
MongoEngine - Atomic Updates
原子性是 ACID 事务属性之一。数据库事务必须是不可分割和不可简化的,以便要么完全发生,要么根本不发生。此属性称为原子性。MongoDB 仅对单一文档支持原子性,而不是多文档事务。
MongoEngine 为查询集的原子更新提供了以下方法。
update_one() - 覆盖或添加与查询匹配的第一条文档。
update() - 对与查询匹配的字段执行原子更新。
modify() - 更新文档并将其返回。
以下的修改器可能会与这些方法一起使用。(这些修改器在字段之前,而不是之后)。
set |
set a particular value |
unset |
delete a particular value |
inc |
按给定量增加值 |
dec |
按给定量减少值 |
push |
将值追加到列表 |
push_all |
将多个值追加到列表 |
pop |
根据值删除列表第一个或最后一个元素 |
pull |
从列表中删除一个值 |
pull_all |
从列表中删除多个值 |
add_to_set |
仅在列表中不存在某个值时,才将该值添加到列表 |
以下是一个原子更新的示例,我们首先创建一个名为测试的文档类,并在其中添加一个文档。
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"}]
}