MongoDB for node.js developers 七周學習-最終測試小結(1)

來源:互聯網
上載者:User

標籤:

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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.