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"}]
}
廣告
© . All rights reserved.