1. 程式人生 > >MongoDB學習記錄05-原子性操作

MongoDB學習記錄05-原子性操作

說明

mongodb不支援事務,但是mongodb提供了許多原子操作,比如文件的儲存,修改,刪除等,都是原子操作。所謂原子操作就是要麼這個文件儲存到Mongodb,要麼沒有儲存到Mongodb,不會出現查詢到的文件沒有儲存完整的情況。

修改示例

MongoDB提供了兩種更新方式 替換與更新

替換

獲取一條資料

db.user.find({"_id":ObjectID("590a9d1723485e21b8eb19a7")})

結果如下: ID 590a9d1723485e21b8eb19a7

{
    "_id" : ObjectId("590a9d1723485e21b8eb19a7"
)
, "address" : "蛟河市", "age" : 116, "email" : "[email protected]", "height" : 157, "job" : "其他木材採運人員", "nickname" : "鄧己久", "phone" : "12510386447", "school" : "遼寧特殊教育師範高等專科學校", "sex" : 1, "hoby" : [ "天津工程職業技術學院", "包頭鐵道職業技術學院", "電機裝配工"
, "火炮膛線製作工" ]
, "dog" : { "name" : "扶丙久", "age" : 16 } }

進行操作

db.user.update({"_id":ObjectID("590a9d1723485e21b8eb19a7")},{"hello":"mongDB"})

再來查詢

db.user.find({"_id":ObjectID("590a9d1723485e21b8eb19a7")})

結果如下

{
    "_id" : ObjectId("590a9d1723485e21b8eb19a7"
)
, "hello" : "mongDB" }

結論:MongoDB完全生成了一個新的文件覆蓋了舊的文件.

更新

針對上面資料執行如下語句進行修改

db.user.update({"_id":ObjectID("590a9d1723485e21b8eb19a7")},{$set: {"age":100,"phone":13000000001}})

查詢這條資料修改後的結果

db.user.find({"_id":ObjectID("590a9d1723485e21b8eb19a7")})
{
    "_id" : ObjectId("590a9d1723485e21b8eb19a7"),
    "hello" : "mongDB",
    "age" : 100,
    "phone" : 13000000001
}
結論 : 可以看到hello MongoDB  這對 key-value並沒有改變,而是增加了 age,phone兩個key和對應的值

修改結論

上面的針對性更新操作 就是表述的 MongoDB中的原子性更新,它並不會影響其他的原子性操作只是針對文件進行鍼對性操作.

原子性常用操作命令

更新操作

$set 更新文件中的某一個鍵,如果不存在則新增,如果存在則替換

$unset 刪除文件中的某一個鍵

$inc 可以對文件的某個值為數字型(只能為滿足要求的數字)的鍵進行增減的操作

$rename 對鍵進行重新命名

陣列的更新操作

$push 把value追加到key裡面去,key一定要是陣列型別才行,如果key不存在,會新增一個數組型別加進去

$pushall 同 push,只是一次可以追加多個值到一個數組欄位內

$addToSet : 增加一個值到陣列內,而且只有當這個值不在陣列內才增加

$pop 刪除陣列的第一個或最後一個元素 ,接受兩個引數 key 和 1or-1 1 表示最後一個元素,-1表示第一個元素

$pull
從陣列內刪除一個等於value值

$pullAll
從陣列內刪除多個等於不同value值

Java中原子操作

查詢一條資料

db.user.find({"_id":ObjectID("590a9d1723485e21b8eb19a8")})

結果

這裡寫程式碼片
{
    "_id" : ObjectId("590a9d1723485e21b8eb19a8"),
    "address" : "佳木斯",
    "age" : 76,
    "email" : "[email protected]",
    "height" : 187,
    "job" : "火工品管理工",
    "nickname" : "須尤央",
    "phone" : "11209067005",
    "school" : "梧州學院",
    "sex" : 0,
    "hoby" : [
        "審計人員",
        "河北師範大學匯華學院",
        "中南民族大學",
        "基礎件裝配工"
    ],
    "dog" : {
        "name" : "葛習厲",
        "age" : 103
    },
    "hello" : 1,
    "count" : 10
}

替換

程式碼

    @Test
    public void testReplace(){
        Document doc = new Document("count", 10);
        coll.replaceOne(Filters.eq("_id", new ObjectId("590a9d1723485e21b8eb19a8")), doc);
    }

結果

{
    "_id" : ObjectId("590a9d1723485e21b8eb19a8"),
    "count" : 10
}

更新

程式碼(命令形式)

    @Test
    public void testAtomically(){
        Document doc = new Document();
        doc.append("$set", new Document("hello", "mongodb"));
        coll.updateOne(Filters.eq("_id", new ObjectId("590a9d1723485e21b8eb19a8")), doc);
    }

結果

{
    "_id" : ObjectId("590a9d1723485e21b8eb19a8"),
    "count" : 10,
    "hello" : "mongodb"
}

程式碼 工具類

    @Test
    public void testAtomically2(){
        coll.updateOne(Filters.eq("_id", new ObjectId("590a9d1723485e21b8eb19a8")), Updates.set("ok", "good"));
    }

相關推薦

MongoDB學習記錄05-原子操作

說明 mongodb不支援事務,但是mongodb提供了許多原子操作,比如文件的儲存,修改,刪除等,都是原子操作。所謂原子操作就是要麼這個文件儲存到Mongodb,要麼沒有儲存到Mongodb,不會出現查詢到的文件沒有儲存完整的情況。 修改示例 Mon

(Java學習筆記)i++不是原子操作

public class CasStudy01 { private static int count = 0; public static void main(String[] args) { Runnable runnable

mongodb學習記錄

創建 shel root nec chown 啟動 開啟 出錯 con 在啟動mongod的時候會出錯,有個地方是因為/data/db的權限是錯的,因為要創建該目錄需要root權限,創建完了之後需要chown xxx /data把該目錄修改成當前用戶,否則啟動會報錯,或者用

無鎖機制下的原子操作

true setname boolean cnblogs 添加 amp 硬件 rfi tom   通常使用volatile關鍵字修飾字段可以實現多個線程的可見性和讀寫的原子性,但是對於字段的復雜性操作就需要使用synchronize關鍵字來進行,例如: public cl

MongoDB學習記錄

users 泰安 系統設置 2.3 默認端口 erp nec acl 負責 本博客說明:最開始部分是一個運維部署案例模板,給開發安裝MongoDB都可以按照這個模板來進行基本部署,中間部分是自己研究其他博客記錄部署和授權相關內容,最後部分是網上視頻學習相關內容;www.mo

JUC學習筆記之原子問題——02

/*  * 一、i++ 的原子性問題:i++ 的操作實際上分為三個步驟“讀-改-寫”  *           int i = 10;  *      &nbs

原子操作的實現原理

原子的概念: 本意為不能進行分割的最小粒子,原子操作意為不可中斷的一個或者一系列操作 處理器如何實現原子操作 32位IA-32處理器使用基於對快取加鎖或匯流排加鎖的方式來實現多處理器之間的原子操作。首先處理器會自動保證基本的記憶體操作的原子性。處理器保證從系統記憶體中讀取或者寫入一個位元組是

MongoDB 學習記錄(二)yum安裝

cd /etc/yum.repos.d/ #進入yum包管理vim mongodb-org-4.0.repo #建立檔案,檔名為MongoDB的對應版本 #在檔案中寫入下面內容,儲存退出 [mongodb-org-4.0]name=MongoDB Repositorybaseurl=https://re

JDK8中新增原子操作類LongAdder

LongAdder簡單介紹 LongAdder類似於AtomicLong是原子性遞增或者遞減類,AtomicLong已經通過CAS提供了非阻塞的原子性操作,相比使用阻塞演算法的同步器來說效能已經很好了,但是JDK開發組並不滿足,因為在非常高的併發請求下AtomicLong的效能不能讓他們接受,

MongoDB學習(四) Java操作MongoDB

一、連線資料庫連線資料庫,你需要指定資料庫名稱,如果指定的資料庫不存在,mongo會自動建立資料庫。 所需jar包: mongo-java-driver-3.2.2.jar 連線資料庫的Java程式碼如下:import com.mongodb.MongoClient; imp

MongoDB學習03之JAVA簡單操作增刪改查

       經過前面幾篇博文的學習,對MongoDB已經有一定的瞭解了,現在用JAVA來操作MongoDB,進行一些簡單的增刪改查,查詢有複雜查詢,這裡不一一列舉,同學自己看看API就OK了。       MongoDB JAVA驅動下載:https://github.c

Java併發程式設計-原子操作

所謂原子性操作,指執行一系列操作時,這些操作要麼全部執行,要麼全部不執行,不存在只執行其中一部分的情況。 計數器情況:一般在設計計數器的時候都是先讀取當前值,然後 +1,最後更新。真個過程是讀-改-寫的過程,如果不能保證該過程的原子性,那麼就會出現執行緒安全問題。如下程式碼就不能保證 ++a 是原子性操作。

memcached 原子操作 CAS模式

應用場景分析:        如原來MEMCACHED中的KES的內容為A,客戶端C1和客戶端C2都把A取了出來,C1往準備往其中加B,C2準備往其中加C,這就會造成C1和C2執行後的CACHE KEYS要麼是AB要麼是AC,而不會出現我們期望的ABC。這種情況,

mongodb學習記錄之四:聚合

group這個一直是迷迷糊糊的,上網找了好多例子,慢慢分析,慢慢消化。 下面兩個例子都是mongodb權威指南一本書上給的。 下面使用一個例子來消化group,先準備資料: db.blog.insert({title:"J2EE實戰",author:"li",day:"2012-12-12",tags:["

一段JAVA代碼了解多線程,JUC、CAS原子操作

current 排序 沒有 共享數據 信號 call countdown for ride @Test public void testPaceController_multiThread() throws InterruptedException {

mongodb學習記錄之一:基礎查詢

最近在學習mongodb,在學習的過程中,記錄一下部落格,以備以後檢視。 今天先記錄一下find查詢。 在學習之前先往資料庫中插入一定量的資料,這裡我使用迴圈,插入了4096條資料,格式如下: { "name":"李明", "sex":"男", "score":{

吳恩達機器學習記錄--Matlab 一些基本操作

機器學習 比較 基本操作 邏輯 mat 取整 單位 long length 1.加減乘除2.真假 “== ~=”3.邏輯與 邏輯或 “&& ||”4.變量位數長短  format short/format long  %0.2f (小數點後兩位

java中同步(synchronized)訪問共享的可變資料及原子操作

當多個執行緒共享可變資料的時候,每個讀或者寫資料的執行緒都必須執行同步。如果沒有同步,就無法保證一個執行緒所做的修改可以被另外一個執行緒獲知。未能同步共享可變資料會造成程式的活性失敗(liveness failure)和安全性失敗(safety failure)

linux核心部件分析(二)——原子操作atomic_t +自我分析總結

在任何處理器平臺下,都會有一些原子性操作,供作業系統使用,我們這裡只講x86下面的。 原子操作的概念來自物理學中微粒的概念原子不可再分性,說明原子操作是不會被執行緒排程機制打斷的操作,不會被編譯器自動優化掉,必定執行的操作; 在單處理器情況下,每條

新姿勢!Redis中調用Lua腳本以實現原子操作

使用方法 default 2.6 nil 變量 data ready 語法 commands 背景:有一服務提供者Leader,有多個消息訂閱者Workers。Leader是一個排隊程序,維護了一個用戶隊列,當某個資源空閑下來並被分配至隊列中的用戶時,Leader會向訂閱者