MongoDB學習筆記

1帖烘、$where查詢

不是非常必要時洒试,一定要避免使用“$where”查詢,因為它們在速度上要比常規(guī)查詢慢很多秘遏。每個文檔要從BSON轉(zhuǎn)換成Javascript對象拷沸,然后通過“$where”的表達式來運行限匣。同樣還不能利用索引余指。所以,只在走投無路時才考慮“$where”這種用法舍扰。
  將常規(guī)查詢作為前置過濾,與“$where”組合使用可以不犧牲性能希坚。如果可能的話边苹,用索引根據(jù)非“$where”子句進行過濾,“$where”只用于對結(jié)果進行調(diào)優(yōu)裁僧。

2个束、游標
  數(shù)據(jù)庫使用游標來返回find的執(zhí)行結(jié)果,客戶端對游標的實現(xiàn)通常能夠?qū)ψ罱K結(jié)果進行有效的控制聊疲〔绲祝可以限制結(jié)果的數(shù)量,略過部分結(jié)果获洲,根據(jù)任意方向任意鍵的組合對結(jié)果進行各種排序阱表,或者是執(zhí)行其他一些功能強大的操作。
  要想從shell中創(chuàng)建一個游標,首先要對集合填充一些文檔最爬,然后對其執(zhí)行查詢涉馁,并將結(jié)果分配給一個局部變量(用var聲明的變量就是局部變量)。要迭代結(jié)果爱致,可以使用游標的next方法烤送,也可以使用hasNext來查看有沒有其他結(jié)果。例如:

> var cursor =  db.collection.find();
> while (cursor.hasNext()){
       obj = cursor.next();
       // do stuff
}

3糠悯、索引
建立索引的方法:

db.people.ensureIndex({"username":1})  #以username為索引 
db.people.ensureIndex({"date":1,"username":1}) #以date,username為索引
db.people.ensureIndex({"comments.date":1}) #索引內(nèi)嵌文檔中的鍵和普通的鍵創(chuàng)建索引沒有什么區(qū)別
db.people.ensureIndex({"username":1},{"background":true}) #建立索引既耗時也費力帮坚,還需要消耗很多資源。使用{"background":true}選項可以使這個過程在后臺完成逢防,同時正常處理請求

建立索引時要考慮如下問題:

  • 會做什么樣的查詢叶沛?其中哪些鍵需要索引?
  • 每個鍵的索引方向是怎樣的忘朝?
  • 如何應對擴展灰署?有沒有種不同的鍵的排列可以使常用數(shù)據(jù)更多地保留在內(nèi)存中?
    要是能回答這些問題局嘁,說明你已經(jīng)做好了索引的準備了溉箕。

創(chuàng)建索引的缺點就是每次插入、更新和刪除時都會產(chǎn)生額外的開銷悦昵。這是因為數(shù)據(jù)庫不但需要執(zhí)行這些操作肴茄,還要將這些操作在集合的索引中標記。因此但指,要盡可能少創(chuàng)建索引寡痰。每個集合默認的最大索引個數(shù)為64個。

注意:一定不要索引每一個鍵棋凳。這會導致插入非常慢拦坠,還會占用很多空間,并且很可能對查詢速度提升不大剩岳。

MongoDB排序需要將所有數(shù)據(jù)提取到內(nèi)存來排序贞滨,因此,可以做無索引排序是有個上限的拍棕,那就是不可能在內(nèi)存里面做T級別數(shù)據(jù)的排序晓铆。一旦集合大到不能在內(nèi)存中排序,MongoDB就會報錯绰播。

索引管理:索引的元信息存儲在每個數(shù)據(jù)庫的system.indexes集合中骄噪。這是一個保留集合,不能對其插入或者刪除文檔蠢箩。操作只能通過ensureIndex或者dropIndexes進行腰池。
建立索引既耗時也費力尾组,還需要消耗很多資源。使用{"background":true}選項可以使這個過程在后臺完成示弓,同時正常處理請求讳侨。

MongoDB支持動態(tài)建立普通集合,還支持固定集合(要實現(xiàn)創(chuàng)建奏属,而且大小固定跨跨。如果固定集合空間不足,最早的文檔就會被刪除囱皿,為新的文檔騰出空間勇婴,這意味著固定集合在新文檔插入的時候自動淘汰最早的文檔。

固定集合和普通集合還有一個區(qū)別嘱腥,就是在默認情況下固定集合沒有索引耕渴,即便是“_id”上也沒有索引。

固定集合有種特殊的排序方式齿兔,叫做“自然排序”橱脸。自然排序就是文檔在磁盤上的順序順時針方向依次的。文檔總數(shù)安裝插入的順序存儲的分苇,自然順序就是與此相同的添诉。也可以使用自然排序按照反向插入的順序查詢。

尾部游標只能在固定集合上使用医寿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末栏赴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子靖秩,更是在濱河造成了極大的恐慌须眷,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沟突,死亡現(xiàn)場離奇詭異柒爸,居然都是意外死亡,警方通過查閱死者的電腦和手機事扭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乐横,“玉大人求橄,你說我怎么就攤上這事∑瞎” “怎么了罐农?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長催什。 經(jīng)常有香客問我涵亏,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任气筋,我火速辦了婚禮拆内,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宠默。我一直安慰自己麸恍,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布搀矫。 她就那樣靜靜地躺著抹沪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓤球。 梳的紋絲不亂的頭發(fā)上融欧,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音卦羡,去河邊找鬼噪馏。 笑死,一個胖子當著我的面吹牛虹茶,可吹牛的內(nèi)容都是我干的逝薪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蝴罪,長吁一口氣:“原來是場噩夢啊……” “哼董济!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起要门,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤虏肾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后欢搜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體封豪,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年炒瘟,在試婚紗的時候發(fā)現(xiàn)自己被綠了吹埠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡疮装,死狀恐怖缘琅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情廓推,我是刑警寧澤刷袍,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站樊展,受9級特大地震影響呻纹,放射性物質(zhì)發(fā)生泄漏堆生。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一雷酪、第九天 我趴在偏房一處隱蔽的房頂上張望淑仆。 院中可真熱鬧,春花似錦太闺、人聲如沸糯景。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蟀淮。三九已至,卻和暖如春钞澳,著一層夾襖步出監(jiān)牢的瞬間怠惶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工轧粟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留策治,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓兰吟,卻偏偏與公主長得像通惫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子混蔼,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

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

  • mongoDB簡介 MongoDB是用C++語言編寫的非關(guān)系型數(shù)據(jù)庫履腋。特點是高性能、易部署惭嚣、易使用遵湖,存儲數(shù)據(jù)十分方...
    AubreyXue閱讀 659評論 2 3
  • MongoDB 基本概念 數(shù)據(jù)庫 MongoDB一個數(shù)據(jù)庫包括多個集合,類似于MySQL中一個數(shù)據(jù)庫包含多個表晚吞;一...
    唔代閱讀 968評論 0 0
  • Mongo MongoDB 是一個基于分布式文件存儲的數(shù)據(jù)庫延旧。由C++語言編寫。旨在為WEB應用提供可擴展的高性能...
    果子煎餅同學閱讀 161評論 0 0
  • 1. 基本查詢: 構(gòu)造查詢數(shù)據(jù)槽地。 > db.test.findOne() { "_id" : ObjectId("...
    三萬_chenbing閱讀 174評論 0 0
  • MongoDB, MySQL和Redis的區(qū)別和使用場景 MySQL是關(guān)系型數(shù)據(jù)庫迁沫,支持事件 MongoDB和Re...
    Guang777閱讀 221評論 0 1