標籤:
MonogoDB官網上提供了許多免費課程,就選擇了"MongoDB for node.js developers"學習。課程當然是英文的啦,不過有中文字幕~,每次課程後還有練習。七周的課程過去的很快,學到了不少的內容。藉助著最終測試的題,做一次小結,省得自己不久後忘記(哎,記性差= =)
最後的測試一共有十道題,考察的內容分別是:1、查詢 2、彙總 3、更新$addToSet 4、更新$inc 5、索引 6、添加最佳化 7、遊標 8、副本 9、片鍵 10、索引的explain屬性
1、查詢
function ( query , fields , limit , skip, batchSize, options ){ var cursor = new DBQuery( this._mongo , this._db , this , this._fullName , this._massageObject( query ) , fields , limit , skip , batchSize , options || this.getQueryOptions() ); var connObj = this.getMongo(); var readPrefMode = connObj.getReadPrefMode(); if (readPrefMode != null) { cursor.readPref(readPrefMode, connObj.getReadPrefTagSet()); } return cursor;}
從上面的函數可以看出find函數接受6個參數,query查詢條件,fields指定需要返回的鍵,limit限制返回結果,skip跳過X個查詢結果,batchSize設定返回批次數量,option其他設定。
查詢條件可以查詢大於($gt),小於($lt),或查詢等等。詳細用法見官網。
Mongo還可以對數組進行查詢,用法不難,像查詢一個數組裡有沒有包含一個要尋找內容,這時跟普通的查詢沒有任何區別,這時尋找到的內容是數組的子集。如果只要完全符合自己的查詢條件的結果,要使用$all。如果要查詢的結果包含任意查詢條件時,使用$in。
很多時候我們知道我們要找的內容在數組的位置時,可以使用像下標的方式尋找。像
db.inventory.find( { ‘memos.0.by‘: ‘shipping‘ } )
0表示位於數組的第一位置,後面的".by"是指查詢其內嵌文檔,這是mongo提供的dot文法。
2、彙總
彙總可以使我們分析資料,它使用了管道的概念,也就是通過一組數組設定一系列順序執行的任務,每個任務的結果是下一個任務的輸入。
借用官網的一張圖:
上面的彙總中先匹配了status等於A的文檔,然後根據cust_id分組並對各分組的amount加總。
總共提供了篩選管道操作符$match,$limit,$skip,排序管道操作符$sort,分組操作符$group,投射操作符$project和拆分操作符$unwind等。
3、更新 $addToSet
直接使用update是整體覆蓋型更新,而我們常常只要更新文檔的一部分。一般常用$set修改器,當我們想對一個數組新增內容時可以使用$push,但$push只是單純添加到數組末尾,如果我們要保證數組內的內容唯一性的話應該使用$addToSet
//syntax{ $addToSet: { <field1>: <value1>, ... } };//exampledb.test.update( { _id: 1 }, { $addToSet: {letters: [ "c", "d" ] } })
4、更新$inc
$inc修改器用來增加已有的索引值,或者不存在就建立一個。
在這道題上自己遇到了點問題。我需要對一個數組內給定的位置的文檔更新,位置是一個變數,這裡假設是變數名是comment_ordinal
你可以像上面提到的Array.0.foo來更新
{$inc: {Array.0.foo: 1}}
但不可以像以下的方法來更新
{$inc: {Array.comment_ordinal.foo: 1}; //直接報錯{$inc: {"Array.comment_ordinal.foo": 1}; //會建立一個Array:[{comment_ordinal.foo: 1},.....]
那時候自己就卡在這裡。。。。。現在想想也是思維被框架構架給限制住了。
{ $inc: { <field1>: <amount1>, <field2>: <amount2>, ... } }
看慣了這樣的寫法後就忘了{ <field1>: <amount1>, <field2>: <amount2>, ... }這東西也是個對象啊!!!
var selector = {}; selector[‘comments.‘ + comment_ordinal + ‘.num_likes‘] = 1; posts.update({‘permalink‘: permalink}, {$inc: selector},.......)
可以把{Array.0.foo: 1}整個包裹起來嘛~,這樣就ok了。
5、索引
索引能提供更高效的尋找,當然有些時候相反。
索引基本有3種類型:單鍵索引、複合索引、多鍵索引
單鍵索引:db.friends.createIndex( { "name" : 1 } )
複合索引:db.products.createIndex( { "item": 1, "stock": 1 } )
多鍵索引:如果索引的某個鍵在某個文檔中是一個數組,那麼這就會被mongodb自動為多鍵索引,不需要你額外的設定。這在查詢數組時會很有效率(官網上這麼寫著,沒實踐過)
MongoDB for node.js developers 七周學習-最終測試小結(1)