MongoDB:14-MongoDB- 原子操作
Redis採用的是非同步I/O非阻塞的單程序模型,每一條Redis命令都是原子性的。
那麼mongoDB呢? mongo有哪些原子操作呢?有哪些實現事務性操作的技巧呢?
Redis採用的是非同步I/O非阻塞的單程序模型,每一條Redis命令都是原子性的。
那麼mongoDB呢? mongo有哪些原子操作呢?有哪些實現事務性操作的技巧呢?
MongoDB 原子操作
mongodb不支援事務,所以,在你的專案中應用時,要注意這點。無論什麼設計,都不要要求mongodb保證資料的完整性。
但是mongodb提供了許多原子操作,比如文件的儲存,修改,刪除等,都是原子操作。
所謂原子操作就是要麼這個文件儲存到Mongodb,要麼沒有儲存到Mongodb,不會出現查詢到的文件沒有儲存完整的情況。
原子操作資料模型
- 考慮下面的例子,圖書館的書籍及結賬資訊。
- 例項說明了在一個相同的文件中如何確保嵌入欄位關聯原子操作(update:更新)的欄位是同步的。
book ={
_id:123456789,
title:"MongoDB: The Definitive Guide",
author:["Kristina Chodorow","Mike Dirolf"],
published_date:ISODate("2010-09-24"),
pages:216,
language:"English",
publisher_id
available:3,
checkout:[{ by:"joe", date:ISODate("2012-10-15")}]
}
- 你可以使用 db.collection.findAndModify() 方法來判斷書籍是否可結算並更新新的結算資訊。
- 在同一個文件中嵌入的 available 和 checkout 欄位來確保這些欄位是同步更新的:
-
db.books.findAndModify ({
query:{
_id:123456789,
available:{ $gt
},
update:{
$inc:{ available:-1},
$push:{ checkout:{ by:"abc", date:newDate()}}
}
})
擁有類似事務特性的更新與查詢操作——findAndModify.
它是原子性的,會返回符合查詢條件的更新後的文件。
db.COLLECTION_NAME.findAndModify({query:{},
update:{},
remove:true|false,
new:true|false,
sort:{},
fields:{},
upsert:true|false});
- query是查詢選擇器,與findOne的查詢選擇器相同
- update是要更新的值,不能與remove同時出現
- remove表示刪除符合query條件的文件,不能與update同時出現
- new為true:返回個性後的文件,false:返回個性前的,預設是false
- sort:排序條件,與sort函式的引數一致。
- fields:投影操作,與find*的第二個引數一致。
- upsert:與update的upsert引數一樣。
不論是update的第二個引數,還是findAndModify的update,在不指定更新操作符的情況下,將會用指定的新值替換舊值。
比如,
use iteye;
db.blog.update({_id:ObjectId('......')},{title:'new title'});
//上面的操作就把指定_id的文件的標題改成了‘new title’
如果指定了更新操作符,就可以實現更復雜靈活的更新操作。
可以通過更新操作符,增加或減少數值,針對陣列型別的屬性,做類似佇列或棧的操作。
單從這一點來說,mongo要比sql資料庫強大的多了。
原子操作常用命令(更新操作符)
- $set
- 用來指定一個鍵並更新鍵值,若鍵不存在並建立。
用"$set"甚至可以修改鍵的資料型別
db.users.insert({"name":"egger","age":28,"sex":"male"})
db.users.update({"_id":ObjectId("51826852c75fdd1d8b805801")},{"$set":{"sex":1}})
{ $set :{ field : value }}
使用"$set"修改內嵌文件:
db.posts.update({"author.name":"egger"},{"$set":{"author.name":"mongo","author.age":18}})
- 用來指定一個鍵並更新鍵值,若鍵不存在並建立。
用"$set"甚至可以修改鍵的資料型別
db.users.insert({"name":"egger","age":28,"sex":"male"})
db.users.update({"_id":ObjectId("51826852c75fdd1d8b805801")},{"$set":{"sex":1}})
{ $set :{ field : value }}
使用"$set"修改內嵌文件:
db.posts.update({"author.name":"egger"},{"$set":{"author.name":"mongo","author.age":18}})
- $unset
- 用來刪除一個鍵。
{ $unset :{ field :1}}
- 用來刪除一個鍵。
{ $unset :{ field :1}}
- $inc
- $inc可以對文件的某個值為數字型(只能為滿足要求的數字)的鍵進行增減的操作。
負數,表示減少
"$inc"只能用於整數、長整數或雙精度浮點數。要是用在其他型別的資料上就會導致操作失敗。
{ $inc :{ field : value }}
- $inc可以對文件的某個值為數字型(只能為滿足要求的數字)的鍵進行增減的操作。
負數,表示減少
"$inc"只能用於整數、長整數或雙精度浮點數。要是用在其他型別的資料上就會導致操作失敗。
{ $inc :{ field : value }}
- upsert
upsert是一種特殊的更新操作,不是一個操作符。(upsert = up[date]+[in]sert)
update()方法的三個引數是upsert,這個引數是個布林型別,預設是false。
當它為true的時候,update方法會首先查詢與第一個引數匹配的記錄,在用第二個引數更新之,
如果找不到與第一個引數匹配的的記錄,
就會以這個條件和更新文件為基礎建立一個新的文件。如果找到了匹配的文件,則正常更新。
upsert非常方便,不必預置集合,同一方法可以既建立又更新文件。
- $setOnInsert
當update方法使用upsert選項執行insert操作時,$setOnInsert操作符給相應的欄位賦值。類似sql中update 語句的set。
db.collection.update(<query>,
{ $setOnInsert:{<field1>:<value1>,...}},
{ upsert:true}//{ upsert: true }可以用true替換
)
- $(query)
$ (query)
語法:{"<array>.$": value }
當對陣列欄位進行更新時,且沒有明確指定的元素在陣列中的位置,
我們使用定位操作符("$")標識一個元素,數字都是以0開始的。
和update()一起使用:
定位操作符("$")作為第一個匹配查詢條件的元素的佔位符,也就是在陣列中的索引值。
陣列欄位必須出現查詢文件中。
集合students中有兩條文件:
相關推薦
MongoDB:14-MongoDB- 原子操作
Redis採用的是非同步I/O非阻塞的單程序模型,每一條Redis命令都是原子性的。那麼mongoDB呢? mongo有哪些原子操作呢?有哪些實現事務性操作的技巧呢?
Mo
MongoDB:17-MongoDB-索引限制及其他限制規則
索引-額外開銷
每個索引佔據一定的儲存空間,在進行插入,更新和刪除操作時也需要對索引進行操作。所以,如果你很少對集合進行讀取操作,建議不使用索引。
索引-記憶體(RAM)使用
由於索引是儲
MongoDB:12-MongoDB 資料庫引用(DBRefs vs 手動引用)
資料庫引用的意義:
mongodb中資料的掃描是按行來掃描的,這意味著如果有一個欄位的值長度很長,mongodb不會自動跳過而是將整個文件掃描一遍,當資料量十分密集而這個很長的欄位不需要經
MongoDB:16-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的輕量化二進制格式)存儲的,增刪改
upsert是一種特殊的更新操作,不是一個操作符。(upsert = up[date]+[in]sert)
update()方法的三個引數是upsert,這個引數是個布林型別,預設是false。
當它為true的時候,update方法會首先查詢與第一個引數匹配的記錄,在用第二個引數更新之,
如果找不到與第一個引數匹配的的記錄,
就會以這個條件和更新文件為基礎建立一個新的文件。如果找到了匹配的文件,則正常更新。
upsert非常方便,不必預置集合,同一方法可以既建立又更新文件。
當update方法使用upsert選項執行insert操作時,$setOnInsert操作符給相應的欄位賦值。類似sql中update 語句的set。
db.collection.update(<query>,
{ $setOnInsert:{<field1>:<value1>,...}},
{ upsert:true}//{ upsert: true }可以用true替換
)
$ (query)
語法:{"<array>.$": value }
當對陣列欄位進行更新時,且沒有明確指定的元素在陣列中的位置,
我們使用定位操作符("$")標識一個元素,數字都是以0開始的。
和update()一起使用:
定位操作符("$")作為第一個匹配查詢條件的元素的佔位符,也就是在陣列中的索引值。
陣列欄位必須出現查詢文件中。
集合students中有兩條文件:
相關推薦
MongoDB:14-MongoDB- 原子操作
Redis採用的是非同步I/O非阻塞的單程序模型,每一條Redis命令都是原子性的。那麼mongoDB呢? mongo有哪些原子操作呢?有哪些實現事務性操作的技巧呢? Mo
MongoDB:17-MongoDB-索引限制及其他限制規則
索引-額外開銷 每個索引佔據一定的儲存空間,在進行插入,更新和刪除操作時也需要對索引進行操作。所以,如果你很少對集合進行讀取操作,建議不使用索引。 索引-記憶體(RAM)使用 由於索引是儲
MongoDB:12-MongoDB 資料庫引用(DBRefs vs 手動引用)
資料庫引用的意義: mongodb中資料的掃描是按行來掃描的,這意味著如果有一個欄位的值長度很長,mongodb不會自動跳過而是將整個文件掃描一遍,當資料量十分密集而這個很長的欄位不需要經
MongoDB:16-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的輕量化二進制格式)存儲的,增刪改