Mongodb——1

BSON

BSON是一種類似JSON的二進制形式的存儲格式卒煞,簡稱Binary JSON狸驳。它和JSON一樣藕咏,支持內(nèi)嵌的文檔對象和數(shù)組對象再层,但是BSON有JSON沒有的一些數(shù)據(jù)類型贸铜,如Date和BinData類型。它支持下面數(shù)據(jù)類型聂受。每個數(shù)據(jù)類型對應(yīng)一個數(shù)字蒿秦,在MongoDB中可以使用$type操作符查看相應(yīng)的文檔的BSON類型

類型 對應(yīng)數(shù)字 別名 說明
Double1 1 double
String 2 string
Object 3 object
Array 4 array
Binary data 5 binData
Undefined 6 undefined 棄用
ObjectId 7 objectId
Boolean 8 “bool”
Date 9 “date”
Null 10 “null”
Regular Expression 11 “regex”
DBPointer 12 “dbPointer”
JavaScript 13 “javascript”
Symbol 14 “symbol”
JavaScript(with scope) 15 “javascriptWithScope”
32-bit integer 16 “int”
Timestamp 17 “timestamp”
64-bit integer 18 “l(fā)ong”
Min key -1 “minKey”
Max key 127 “maxKey”

CRUD

增刪改差操作

db.collection.insert()、db.collection.insertOne()蛋济、db.collection.insertMany()棍鳖,后兩個在3.2版本新加入。在mongodb中碗旅,插入作用于單個集合collection渡处。

在mongodb中,所有的寫操作在單個文檔的層面上是原子的扛芽。如果一個操作涉及多個文檔的寫操作骂蓖,那么單個文檔的寫操作是原子的,整個操作不是院子的川尖。
_id是每個文檔都會有的主鍵登下。如果插入的時候沒有指定_id茫孔,那么mongodb會自動生成一個ObjectId作為_id。
ObjectId是mongodb中的一個數(shù)據(jù)類型被芳。

db.users.insert(
   {
      name: "sue",
      age: 19,
      status: "P"
   }
)

這里插入的是json格式的數(shù)據(jù)缰贝,mongodb轉(zhuǎn)化為bson格式進行保存。
db.collection.insertOne() 插入一個畔濒,db.collection.insertMany() 插入多個剩晴,insert可以一個可以多個。

mongodb插入數(shù)據(jù)還有db.collection.save()侵状。save的插入邏輯如下:如果沒有指定_id赞弥,則會直接調(diào)用insert命令進行插入;如果指定了_id趣兄,那么會調(diào)用update()命令同時指定upsert為true绽左,即有對應(yīng)的就更新,沒有對應(yīng)的就插入艇潭。

db.collection.remove()拼窥、db.collection.deleteOne()、db.collection.deleteMany()蹋凝,分別是普通刪除鲁纠、刪除一個、刪除多個鳍寂。
通過傳入過濾器進行刪除操作改含,這里的過濾器是指json文檔。mongodb會對符合json過濾器的文檔進行刪除伐割。如果傳入一個空過濾器候味,會刪除所有文檔(只限于db.collection.remove()和db.collection.deleteMany())刃唤。
如果想刪除多個文檔隔心,使用remove和deleteMany;如果想刪除一個文檔尚胞,使用remove(將第二個參數(shù)設(shè)為 1)和deleteOne硬霍。

db.users.remove( { status: "D" }, 1)

此時remove只會刪除一個文檔。當不使用第二個參數(shù)時笼裳,為刪除多個唯卖。

db.collection.updateOne():更新一個
db.collection.updateMany():更新多個
db.collection.replaceOne():替換一個
db.collection.update():默認更新一個,可以使用multi參數(shù)設(shè)定更新多個
接收參數(shù)為:

  1. 過濾條件文檔躬柬,包括普通的文檔和使用查詢操作符的文檔拜轨。
  2. 更新文檔
  3. 更新選項,比如update中是否進行upsert允青,是否對多個文檔更新multi

一般使用update進行更新操作橄碾。因為update支持操作符更新,replace只能更新全文檔。

db.collection.find():查詢操作

  1. query:過濾條件法牲,為一個json文檔史汗。分為普通文檔和使用操作符的文檔。

    查詢操作符:{ <field1>: { <operator1>: <value1> }, ... }拒垃,這里field1為查詢字段名停撞,operator1為查詢操作符,value1為查詢值悼瓮。
    AND操作:直接在文檔里并排表示
    OR操作:使用$or操作符 {$or: [ { status: "A" }, { age: { $lt: 30 } } ] }
    嵌入文檔查詢戈毒,有兩種方式。第一種將整個嵌入文檔完整查詢横堡。比如{"comments" : {"one" : 1, "two" : 2}}副硅,此時嵌入文檔只能完整查詢,不能只查詢其中的某些字段翅萤,比如{"comments" : {"one" : 1}}是查不到數(shù)據(jù)的恐疲。第二種是嵌入文檔的某些字段的查詢,使用{"comments.one" : 1}套么,用英文句號表示嵌入文檔的字段培己,可以只查詢某些字段。
    數(shù)組查詢胚泌。如果寫上數(shù)組標識[ ]省咨,這時只會查詢完整符合查詢條件的數(shù)組,比如{ badges: [ "blue", "black" ] }玷室,元素內(nèi)容和順序都不能錯零蓉。如果只想查詢某個元素,則{ badges: "black" }穷缤。如果想查詢某個位置的元素敌蜂,使用英文句號{ "badges.0": "black" }。

  2. field:返回的字段津肛,用json文檔鍵值對表示章喉,1或true表示返回,0或false表示不返回身坐。嵌入文檔的字段同查詢一樣秸脱,使用英文句號分割

  3. limit:限制返回文檔的個數(shù)

  4. skip:跳過指定的文檔個數(shù)

  5. sort:排序,使用json鍵值對文檔進行表示部蛇,1 為升序摊唇,-1 為降序。

  6. 游標:mongodb會把find結(jié)果返回為一個游標涯鲁,在shell和java client中都是這樣巷查。使用游標去迭代數(shù)據(jù)嘹害,可以防止單次傳輸大量數(shù)據(jù)。

先 sort 再 skip 再 limit

索引

mongodb支持單字段索引吮便、復(fù)合索引笔呀、多key索引、文本索引髓需、地理位置索引等许师。

  • 單字段索引:例如 db.person.createIndex( {age: 1} ) ×糯遥可以加速對age字段的各種查詢請求微渠,默認的_id索引也是單字段索引。{age: 1} 代表升序索引咧擂,也可以通過{age: -1}來指定降序索引逞盆,對于單字段索引,升序/降序效果是一樣的松申。
  • 復(fù)合索引:針對多個字段聯(lián)合創(chuàng)建索引云芦,先按第一個字段排序,第一個字段相同的文檔按第二個字段排序贸桶,依次類推舅逸。例如 db.person.createIndex( {age: 1, name: 1} )。復(fù)合索引可以支持多個字段的組合查詢皇筛,也能滿足符合索引前綴的查詢琉历。除了查詢的需求能夠影響索引的順序,字段值的分布也是一個重要的因素水醋,查詢的時候也要考慮字段的順序旗笔。
  • 多key索引:當索引的字段為數(shù)組時,創(chuàng)建的索引為多key索引拄踪。duokey索引會為數(shù)組中的每個元素建立一條索引蝇恶。
  • 文本索引:能夠進行文本內(nèi)容搜索,性能不好宫蛆。
  • 地理位置索引:可以對地理位置進行索引艘包,一般用于定位需求的猛。

在mongodb中耀盗,索引滿足前綴索引,這是由mongodb的索引實現(xiàn)造成的卦尊。mongodb默認的索引實現(xiàn)為B樹叛拷,是一種針對磁盤IO進行優(yōu)化的樹。在B樹中岂却,節(jié)點中的數(shù)據(jù)范圍是順序排列的忿薇,所以可以實現(xiàn)前綴索引裙椭。有的mongodb存儲引擎支持哈希索引,查詢速度更快署浩,但是不能進行范圍搜索揉燃。
在mongodb中,可以為索引設(shè)置一些屬性:

  • 唯一索引:索引的字段不能出現(xiàn)重復(fù)值筋栋,比如_id索引
  • TTL索引:可以針對某個時間字段炊汤,指定文檔的過期時間(經(jīng)過指定時間后過期 或 在某個時間點過期)
  • 部分索引:只針對某個特定條件的文檔建立索引,3.2后支持
  • 稀疏索引:只針對存在索引字段的文檔建立索引弊攘,可看做是部分索引的一種特殊情況
索引優(yōu)化

mongodb支持對請求進行profiling抢腐。目前支持三種級別的profiling:

  • 0:不開啟profiling
  • 1:將處理時間超過某個閾值(默認100ms)的請求,記錄到DB下的system.profile集合
  • 2:將所有的請求都記錄到system.profile集合

通常襟交,生產(chǎn)環(huán)境建議使用1級別的profiling迈倍,并根據(jù)自身需求配置合理的閾值,用于監(jiān)測慢請求的情況捣域,并及時的做索引優(yōu)化啼染。
索引過多會造成寫入、更新的性能地下焕梅,索引并不是越多越好提完,需要根據(jù)實際情況進行優(yōu)化。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丘侠,一起剝皮案震驚了整個濱河市徒欣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蜗字,老刑警劉巖打肝,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異挪捕,居然都是意外死亡粗梭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門级零,熙熙樓的掌柜王于貴愁眉苦臉地迎上來断医,“玉大人,你說我怎么就攤上這事奏纪〖停” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵序调,是天一觀的道長醉锅。 經(jīng)常有香客問我,道長发绢,這世上最難降的妖魔是什么硬耍? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任垄琐,我火速辦了婚禮,結(jié)果婚禮上经柴,老公的妹妹穿的比我還像新娘狸窘。我一直安慰自己,他們只是感情好坯认,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布朦前。 她就那樣靜靜地躺著,像睡著了一般鹃操。 火紅的嫁衣襯著肌膚如雪韭寸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天荆隘,我揣著相機與錄音恩伺,去河邊找鬼。 笑死椰拒,一個胖子當著我的面吹牛晶渠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播燃观,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼褒脯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缆毁?” 一聲冷哼從身側(cè)響起番川,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脊框,沒想到半個月后颁督,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡浇雹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年沉御,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昭灵。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡吠裆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烂完,到底是詐尸還是另有隱情试疙,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布窜护,位于F島的核電站效斑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏柱徙。R本人自食惡果不足惜缓屠,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望护侮。 院中可真熱鬧敌完,春花似錦、人聲如沸羊初。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽长赞。三九已至晦攒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間得哆,已是汗流浹背脯颜。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贩据,地道東北人栋操。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像饱亮,于是被迫代替她去往敵國和親矾芙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容