1. 程式人生 > >MongoDB:14-MongoDB- 原子操作

MongoDB:14-MongoDB- 原子操作

  1. Redis採用的是非同步I/O非阻塞的單程序模型,每一條Redis命令都是原子性的。
  2. 那麼mongoDB呢? mongo有哪些原子操作呢?有哪些實現事務性操作的技巧呢?

MongoDB 原子操作

  1. mongodb不支援事務,所以,在你的專案中應用時,要注意這點。無論什麼設計,都不要要求mongodb保證資料的完整性
  2. 但是mongodb提供了許多原子操作,比如文件的儲存,修改,刪除等,都是原子操作。
  3. 所謂原子操作就是要麼這個文件儲存到Mongodb,要麼沒有儲存到Mongodb,不會出現查詢到的文件沒有儲存完整的情況。

原子操作資料模型

  • 考慮下面的例子,圖書館的書籍及結賬資訊。

  • 例項說明了在一個相同的文件中如何確保嵌入欄位關聯原子操作(update:更新)的欄位是同步的
    1. book ={
    2. _id:123456789,
    3. title:"MongoDB: The Definitive Guide",
    4. author:["Kristina Chodorow","Mike Dirolf"],
    5. published_date:ISODate("2010-09-24"),
    6. pages:216,
    7. language:"English",
    8. publisher_id
      :"oreilly",
    9. available:3,
    10. checkout:[{ by:"joe", date:ISODate("2012-10-15")}]
    11. }
  • 你可以使用 db.collection.findAndModify() 方法來判斷書籍是否可結算並更新新的結算資訊
    • 在同一個文件中嵌入的 available 和 checkout 欄位來確保這些欄位是同步更新的:
    1. db.books.findAndModify ({
    2. query:{
    3. _id:123456789,
    4. available:{ $gt
      :0}
    5. },
    6. update:{
    7. $inc:{ available:-1},
    8. $push:{ checkout:{ by:"abc", date:newDate()}}
    9. }
    10. })
    1. 擁有類似事務特性的更新與查詢操作——findAndModify.
    2. 它是原子性的,會返回符合查詢條件的更新後的文件。
      1. db.COLLECTION_NAME.findAndModify({query:{},
      2. update:{},
      3. remove:true|false,
      4. new:true|false,
      5. sort:{},
      6. fields:{},
      7. upsert:true|false});
      • query是查詢選擇器,與findOne的查詢選擇器相同
      • update是要更新的值,不能與remove同時出現
      • remove表示刪除符合query條件的文件,不能與update同時出現
      • newtrue:返回個性後的文件,false:返回個性前的,預設是false
      • sort:排序條件,與sort函式的引數一致。
      • fields:投影操作,與find*的第二個引數一致。
      • upsert:與updateupsert引數一樣。
    3. 不論是update的第二個引數,還是findAndModifyupdate,在不指定更新操作符的情況下,將會用指定的新值替換舊值。
    4. 比如,
      1. use iteye;
      2. db.blog.update({_id:ObjectId('......')},{title:'new title'});
    5. //上面的操作就把指定_id的文件的標題改成了‘new title’
      • 如果指定了更新操作符,就可以實現更復雜靈活的更新操作。
      • 可以通過更新操作符,增加或減少數值,針對陣列型別的屬性,做類似佇列或棧的操作
      • 單從這一點來說,mongo要比sql資料庫強大的多了。

原子操作常用命令(更新操作符)

  • $set
    • 用來指定一個鍵並更新鍵值,若鍵不存在並建立。
      1.  用"$set"甚至可以修改鍵的資料型別
        1. db.users.insert({"name":"egger","age":28,"sex":"male"})
        2. db.users.update({"_id":ObjectId("51826852c75fdd1d8b805801")},{"$set":{"sex":1}})
      1. { $set :{ field : value }}
        1. 使用"$set"修改內嵌文件:
        1. db.posts.update({"author.name":"egger"},{"$set":{"author.name":"mongo","author.age":18}})

  • $unset
    • 用來刪除一個鍵。
      1. { $unset :{ field :1}}

  • $inc
    • $inc可以對文件的某個值為數字型(只能為滿足要求的數字)的鍵進行增減的操作。
      1. 負數,表示減少
      1. "$inc"只能用於整數、長整數或雙精度浮點數。要是用在其他型別的資料上就會導致操作失敗。
      1. { $inc :{ field : value }}

  • upsert
    1. upsert是一種特殊的更新操作,不是一個操作符。(upsert = up[date]+[in]sert
    2. update()方法的三個引數是upsert,這個引數是個布林型別,預設是false
    3. 當它為true的時候,update方法會首先查詢與第一個引數匹配的記錄,在用第二個引數更新之,
    4. 如果找不到與第一個引數匹配的的記錄,
    5. 就會以這個條件和更新文件為基礎建立一個新的文件。如果找到了匹配的文件,則正常更新。
    6. upsert非常方便,不必預置集合,同一方法可以既建立又更新文件。
  • $setOnInsert
    1. update方法使用upsert選項執行insert操作時,$setOnInsert操作符給相應的欄位賦值。類似sqlupdate 語句的set
      1. db.collection.update(<query>,
      2. { $setOnInsert:{<field1>:<value1>,...}},
      3. { upsert:true}//{ upsert: true }可以用true替換
      4. )
  • $(query)
    1. $ (query)
      1. 語法:{"<array>.$": value }
      2. 當對陣列欄位進行更新時,且沒有明確指定的元素在陣列中的位置,
      3. 我們使用定位操作符("$")標識一個元素,數字都是以0開始的。
      4. update()一起使用:
    2. 定位操作符("$")作為第一個匹配查詢條件的元素的佔位符,也就是在陣列中的索引值。
    3. 陣列欄位必須出現查詢文件中。
    4. 集合students中有兩條文件:

        相關推薦

        MongoDB14-MongoDB- 原子操作

        Redis採用的是非同步I/O非阻塞的單程序模型,每一條Redis命令都是原子性的。那麼mongoDB呢? mongo有哪些原子操作呢?有哪些實現事務性操作的技巧呢? Mo

        MongoDB17-MongoDB-索引限制及其他限制規則

        索引-額外開銷 每個索引佔據一定的儲存空間,在進行插入,更新和刪除操作時也需要對索引進行操作。所以,如果你很少對集合進行讀取操作,建議不使用索引。 索引-記憶體(RAM)使用 由於索引是儲

        MongoDB12-MongoDB 資料庫引用(DBRefs vs 手動引用)

        資料庫引用的意義: mongodb中資料的掃描是按行來掃描的,這意味著如果有一個欄位的值長度很長,mongodb不會自動跳過而是將整個文件掃描一遍,當資料量十分密集而這個很長的欄位不需要經

        MongoDB16-MongoDB-索引陣列欄位和索引子文件欄位

        MongoDB允許深入文件內部,對巢狀欄位和陣列建立索引;巢狀物件和陣列欄位可以和複合索引中的頂級欄位一起使用,多數情況下與“正常”索引欄位的行為也是一致的。考慮以下文件集合(use

        面試題【1】i++是否原子操作?並解釋為什麼?

        不是原子操作。理由: 1.i++分為三個階段: 記憶體到暫存器 暫存器自增 寫回記憶體 這三個階段中間都可以被中斷分離開.  2.++i首先要看編譯器是怎麼編譯的, 某些編譯器比如VC在非優化版本中會編譯為以下彙編程式碼: __asm{        moveax,  dw

        MongoDB 原子操作

        sha 存在 lec tid collect 但是 事務 位操作 gpo mongodb不支持事務,所以,在你的項目中應用時,要註意這點。無論什麽設計,都不要要求mongodb保證數據的完整性。 但是mongodb提供了許多原子操作,比如文檔的保存,修改,刪除等,都是原子操

        MongoDB最簡單的入門教程之四使用Spring Boot操作MongoDB

        Spring Boot 是一個輕量級框架,可以完成基於 Spring 的應用程式的大部分配置工作。Spring Boot的目的是提供一組工具,以便快速構建容易配置的Spring應用程式,省去大量傳統Spring專案的繁瑣配置。 MongoDB是一個基於分散式檔

        MongoDB管道操作

        使用聚合框架可以對集合中的文件進行變換和組合。基本上,可以用多個構件建立一個管道(pipeline),用於對一連串的文件進行處理。這些構件包括篩選(filter)、投射(projecting)、分組(grouping)、排序(sorting)、限制(limiti

        Spring Data MongoDB新增、刪除操作

        一.簡介    Spring  Data  MongoDB 專案提供與MongoDB文件資料庫的整合,Spring與Hibernate整合時,Spring提供了org.springframework.orm.hibernate3.HibernateTemplate實現了對資

        MongoDB(3)維護操作連線 & 使用者管理 & 備份

        MongoDB 入門專欄啟動/關閉 mongodb 服務啟動服務mongodb 服務的啟動方式由 2 種,直接通過指定啟動引數啟動,和通過配置檔案啟動,這兩種方式可以混合使用;# 指定啟動引數啟動 mongodb$ mongod --dbpath=/usr/bin/mongo

        什麼是MongoDB原子操作

        原子操作 MongoDB 並不支援多文件原子事務(multi-document atomic transactions)。但它提供了針對單個文件的原子操作。假如一個文件包含數百個欄位,則 update 語句將更新所有的欄位,或者一個也不更新,從而維持了文件級的原子性。原子操

        Spring Data MongoDB進階Aggregation操作(上)

        一、Aggregate簡介                                                                                 db.coll

        淺嘗輒止MongoDB操作(2)

        目錄         大部分摘自《MongoDB大資料處理權威指南》(第3版)。  4. 更新資料 (1)update()         在MongoDB中可以使用update()函式執行資料更新操作。該函式將接受3個主要引數:criteria、objNew和op

        MongoDB學習記錄05-原子操作

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

        mongodb在mongo終端上操作將資料從一個欄位複製到另一個欄位上。

        在mongo終端上操作,把一個collection中中某個欄位值複製到另一個欄位上: >remap = function(x){ if (x.love) { db.user.update({_id: x._id}, {$set: {want: x.love}})

        4.非關系型數據庫(Nosql)之mongodb普通索引,唯一索引

        log 索引 xpl sys watermark lang mon style gravity  一:普通索引 1創建一個新的數據庫 > use toto; switched to db toto

        Scala對MongoDB的增刪改查操作

        自動 back localhost sts hive comm dbo 用戶 hashmap ===========================================     原文鏈接: Scala對MongoDB的增刪改查操作 轉載請註明出處! ======

        MongoDB Java 學習筆記 (Java操作MongoDB)

        sdn 學習筆記 style god java 學習 筆記 b- 學習 .net 原文地址:http://blog.csdn.net/ererfei/article/details/50857103 參考文檔:http://www.runoob.com/mongodb/mo

        C#對Mongodb數組對象操作

        對數 mongodb 寫法 class first div pre 數組 理解 Mongo對數據的存儲非常隨意,需要修改對象中的數組對象時,就會變得比較復雜。 類中的類對象可以直接通過“.”例如:Department.User.name 類中的對象User是數組時可以用De

        MongoDB數據庫基本操作

        完整 用戶 redis hba 數據 table 傳統 標準 數據庫操作 為了保存網站的用戶數據和業務數據,通常需要一個數據庫。MongoDB和Node.js特別般配,因為Mongodb是基於文檔的非關系型數據庫,文檔是按BSON(JSON的輕量化二進制格式)存儲的,增刪改