mongoDB權威指南學習筆記

來源:互聯網
上載者:User

標籤:style   blog   color   os   使用   io   java   strong   ar   

//mongoDB第1-3章節添加,修改,修改器的筆記:

 

//備忘:和MySQL查詢一樣,時刻想著最佳化查詢資料的時間和效能

//db.help() //資料庫協助資訊

//db.blog.help() //集合協助資訊

//db.c.find().help() //返回find()方法的子方法資訊

 

//清空集合資料

//db.blog.remove()

 

//插入資訊

//db.blog.insert({‘title‘ : ‘bbbbb‘, ‘content‘ : ‘bfbfbf‘, ‘hits‘ : 1})

 

//$inc是修改器,只能用於整數,長整形,浮點型

//db.blog.update({‘title‘ : ‘aaaaa‘}, {‘$inc‘ : {‘hits‘ : 1}})

 

//$set是修改器,用於$inc與字串修改

//db.blog.update({‘title‘ : ‘aaaaa‘}, {‘$set‘ : {‘content‘ : ‘testcontent‘}})

 

//簡單的新增屬性/每次都是覆蓋比較麻煩

//aa = db.blog.findOne({‘title‘ : ‘aaaaa‘})

//aa.arr = [‘view‘, ‘click‘]

//db.blog.update({‘title‘ : ‘aaaaa‘}, aa)

 

//如果comments存在$push將會插入資料在資料的末尾,反正則建立comments $push只能操作

//db.blog.update({‘title‘ : ‘aaaaa‘}, {‘$push‘ : {‘comments‘ : {‘name‘ : ‘張三‘, ‘content‘ : ‘我的閃啊‘, ‘reply‘ : 0}}})

 

 

//$addToSet與$push類型一樣,只是前者可以避免插入重複項

//db.blog.update({‘title‘ : ‘aaaaa‘}, {‘$addToSet‘ : {‘comment‘ : {‘name‘ : ‘張三‘, ‘content‘ : ‘我的閃啊‘, ‘reply‘ : 0}}})

 

//刪除comment節點屬性

//db.blog.update({‘title‘ : ‘aaaaa‘}, {‘$unset‘ : {‘comments‘ : {}}})

 

//$pull刪除一維數組選項為view的資料

//db.blog.update({‘title‘ : ‘aaaaa‘}, {‘$pull‘ : {‘arr‘ : ‘view‘}})

 

//數組的定位修改器,通過兩種方式一種是位置,一種是定位操作符(‘$‘)

//db.blog.update({‘title‘ : ‘aaaaa‘}, {‘$inc‘ : {‘comments.0.reply‘ : 1}})

//此處只會修改第一個數組元素的值

//db.blog.update({‘comments.name‘ : ‘張三‘}, {‘$set‘ : {‘comments.$.content‘ : ‘testtemtnsd‘}})

 

//查詢文檔數

//db.blog.count({‘title‘ : ‘aaaaa‘})
//db.blog.find({‘title‘ : ‘aaaaa‘}).count()

 

//更新多個文檔,預設只能更新合格第一個文檔,如果想更新多個文檔需要設定update的第四個參數為true

//db.blog.update({‘title‘ : ‘aaaaa‘}, {‘$inc‘ : {‘hits‘ : 1}}, false, true)

//n表示更新的文檔數, updatedExisting=true表示對文檔已經進行了更新

//db.runCommand({‘getLastError‘ : 1})

 

//移除comments的最後一個元素 {‘$pop‘ : {key : 1}}末尾移除 / {‘$pop‘ : {key : -1}}首位移除

//db.blog.update({"_id" : ObjectId("53fdb010fb4b2154fd546233")},{‘$pop‘:{‘comments‘:1}})

 

//db.blog.find()

 

 

//mongoDB第四章查詢筆記:

 

//簡單查詢

//db.blog.find() //查詢集合所有文檔資料預設應該是20個, find()相當於是find({})

//db.blog.findOne() //查詢集合一條文檔資料,findOne()相當於是findOne({})

 

//並列條件查詢 "And"

//db.blog.find({‘title‘ : ‘aaaaa‘, ‘hits‘ : 10})

 

 

//指定列數的查詢 "select" 備忘:_id 指定也會被返回

//db.blog.find({‘title‘ : ‘aaaaa‘}, {‘title‘ : 1, ‘hits‘: 1})

 

//排除指定的欄位不顯示的方法或不顯示_id的方法

//db.blog.find({‘title‘ : ‘aaaaa‘}, {‘comments‘ : 0, ‘_id‘ : 0})

 

//查詢條件的 ‘<‘,‘<=‘,‘>‘,‘>=‘,‘<>‘ 分別對應‘$lt‘,‘$lte‘,‘$gt‘,‘$gte‘,‘$ne‘, ‘$ne‘適應於所有類型

//db.blog.find({‘hits‘ : {‘$lt‘ : 50, ‘$gt‘ : 1}})

//db.blog.find({‘hits‘ : {‘$lte‘ : 50, ‘$gte‘ : 1}})

//db.blog.find({‘title‘ : {‘$ne‘ : ‘dfdfdf‘}})

 

//$or $in 查詢 備忘:第一個條件儘可能的能查詢更多的資訊這樣才能提高效率

//db.blog.find({‘$or‘ : [{‘title‘ : ‘aaaaa‘}, {‘hits‘ : 1}]})

//db.blog.find({‘title‘ : {‘$in‘ : [‘aaaaa‘, ‘vvvvv‘]}})

//db.blog.find({‘$or‘ : [{‘title‘ : {‘$in‘ : [‘aaaaa‘, ‘bbbbb‘] } }, {‘hits‘ : 1} ]})

 

//取摸運算子號$mod 備忘:$mod會將查詢的第一個值除於$mod第一個給定的值,若餘數等於第二個$mod給定的值則返回結果

//db.blog.find({‘hits‘ : {‘$mod‘ : [2, 1]}}) //備忘將會返回hits為1 3 5 7 9 .....

 

//$not 用來查詢指定條件不符合的文檔通常會和正則一起使用

//db.blog.find({‘hits‘ : {‘$not‘ : {‘$mod‘ : [2, 1]}}}) //備忘將會返回hits為2 4 6 8 10 .....

 

//查詢索引值為null, null會匹配索引值為null和索引值不存在的文檔資料

//db.blog.find({‘nokey‘ : null})

 

//想查詢索引值為null的文檔但是要排除索引值不存在的文檔方法使用$exists與$in

//db.blog.find({‘test‘ : {‘$in‘ : [null], ‘$exists‘ : true }})

 

 

//數組的查詢

//db.blog.insert({‘fruit‘ : [‘apple‘, ‘banana‘]})

//db.blog.insert({‘fruit‘ : [‘apple‘, ‘putao‘]})

//db.blog.insert({‘fruit‘ : [‘chengzi‘, ‘banana‘]})

//db.blog.find({‘fruit‘ : ‘apple‘, ‘fruit‘ : ‘banana‘}) //備忘這種寫法是不合理的

//上面的數組查詢是有問題的,不準確,需要使用$all

//db.blog.find({‘fruit‘ : ‘apple‘})

//db.blog.find({‘fruit‘ : ‘banana‘})

 

//查詢文檔數組中含有‘apple‘和‘banana‘的資料 結果得到一條記錄

//db.blog.find({‘fruit‘ : {‘$all‘ : [‘apple‘, ‘banana‘]} })

 

//如果只想查詢數組第二個元素是‘banana‘的結果 使用數組下標

//db.blog.find({‘fruit.1‘ : ‘banana‘})


//可以使用$push和$addToSet來家數組

//db.blog.update({"_id" : ObjectId("53fec26ab5e462a952616f0a")}, {‘$addToSet‘ : {‘fruit‘ : ‘liulian‘}})


//想返迴文檔數組的前3條資訊 $slice find函數的第二個參數是查詢的列(select)

//db.blog.find({‘title‘ : ‘aaaaa‘}, {‘comments‘ : {‘$slice‘ : 3} })

 

//想返迴文檔數組的第二條到第4條資訊 $slice

//db.blog.find({‘title‘ : ‘aaaaa‘}, {‘comments‘ : {‘$slice‘ : [1, 3]} })


//擷取文檔數組最後一條資訊

//db.blog.find({‘title‘ : ‘aaaaa‘}, {‘comments‘ : {‘$slice‘ : -1} })


//查詢內嵌文檔 查詢與索引值的順序相關所以下面兩種方式應該採用第一種方式 第二種方式需要寫全子集鍵

//內嵌文檔匹配要求整個文檔完全符合

//db.blog.find({‘title‘ : ‘aaaaa‘, ‘comments.name‘ : ‘111‘ })

//db.blog.find({‘comments‘ : {‘name‘ : ‘111‘} })

 

 

//$where查詢 其他查詢方式都無法實現的時候需要用到$where查詢

//不到萬不得以不應該使用$where 他比其他查詢效能要慢點多

//db.blog.insert({‘x‘ : 5, ‘y‘ : 5})

//db.blog.insert({‘x‘ : 3, ‘y‘ : 7})

//db.blog.insert({‘x‘ : 4, ‘y‘ : 6})

//db.blog.insert({‘x‘ : 1, ‘y‘ : 8})

 

//db.blog.find({‘$where‘ : ‘this.x + this.y == 10‘})

//db.blog.find({‘$where‘ : ‘function(){ return this.x + this.y == 10;}‘})

 

//遊標

/*

db.c.remove()

for(i=1; i<100; i++) {

db.c.insert({‘x‘ : i})

}*/

 

//db.c.count()

 

//遊標迴圈查詢的文檔資料

/*

var data = db.c.find()

while(data.hasNext()) {

obj = data.next()

print(obj.x)

}*/

 

//或者可以使用forEach

//var data = db.c.find()

//data.forEach(function(d){print(d.x)})

 

//返回一定數量的結果與排序 sort skip limit

//備忘:三個順序可以隨意搭配但是一般還是按照上面的順序

//{x : 1} x索引值升序, {x : -1}x索引值降序 如果指定多個鍵就按照鍵逐個進行排序

//db.c.find().sort({‘x‘ : 1}).skip(10).limit(10) //通過x索引值升序排列後從第10個開始取10條記錄

//db.c.find().sort({‘x‘ : 1}).limit(10) //預設從第一條開始取10條資料

//db.c.find().sort({‘x‘ : 1}).skip(10) //從第10條開始取全部資料

 

 

//比較順序

//有時候一個索引值有可能有多個類型,mongoDB處理不同類型的資料是有個順序:

//最小值

//null

//數字(整型,長整型,雙精確度型)

//字串

//對象/文檔

//數組

//位元據

//對象ID

//布爾型

//日期型

//時間戳記

//Regex

//最大值

 

 

//備忘:避免使用skip略過大量結果 這點很坑爹啊

 

//隨機選取文檔

//從集合隨機挑選一個文檔是常見的問題,最笨的方法就是選查詢集合的總行數,然後在0到總行數之間取隨機數

//此時db.blog.find().skip(xxxx).limit(1) skip有可能就會略過很大的結果 影響查詢效能

 

//備忘:本人建議文檔插入時添加個欄位size整型,相當於關係型資料庫的自增id, 可以取出第100個記錄的最後id,

//然後再通過id進行比較

 

//可以使用Math.random()類隨機查詢

//var total = db.c.find().count()

//var random = Math.floor(Math.random()*total)

//db.c.find().sort({‘x‘ : 1}).skip(random).limit(1)

 

 

 

//mongoDB第五章索引筆記:

 

//索引就是用來加速查詢的

//建立索引要使用ensureIndex()方法, 同一個集合約一個索引只需要建立一次, 多次建立是徒勞的

//索引是有方向的, 單個索引不需要考慮方向 但是多個索引需要考慮方向

//db.c.ensureIndex({‘x‘ : 1}) //建立升序索引 {x : 1} , {x : -1}

//索引的方向 比如 {‘user_name‘ : 1, ‘age‘ : -1} 此結果將會先按照‘user_name’升序排列, 相同的使用者名稱在按照‘age’降序排列

 

//建立索引測試集合 s

/*for(i=1; i < 100000; i++) {

 

db.s.insert({‘number‘ : i, ‘random‘ : Math.floor(Math.random()*i)})

}*/

 

//db.s.ensureIndex({‘random‘ : 1})

 

//db.s.find({‘number‘ : {‘$gte‘ : 50}}).sort({‘random‘ : 1}).limit(10)

 

//建立索引需要考慮的問題

//1、會做什麼樣的查詢,其中哪些鍵需要索引

//2、每個鍵的索引方向是什麼樣的

//3、如何應對拓展

 

//內嵌文檔建立索引和文檔建立索引一樣的

//db.blog.ensureIndex({‘comments.name‘ : 1})

 

//為排序建立索引

//唯一索引/複合索引

//索引名稱 預設: keyname1_dir1 即(random_1) keynameX代表鍵, dirX代表升序或降序

//自訂索引的名稱

//db.c.ensureIndex({‘x‘ : 1}, {‘name‘ : ‘x_index‘})

//db.c.find({‘x‘ : {‘$lt‘ : 20}}).explain()

 

 

//使用explain檢測查詢的時間/影響的行數/是否使用索引

//使用hint強制使用索引,多數情況下是沒有什麼必要的

//cursor (BasicCursor沒有使用索引 / BtreeCursor x_1 使用索引)

//millis 執行預測的時間(秒) 當然越接近0越好

//nscanned 執行查詢的文檔數

//n 執行返回的文檔數

 

//索引管理

//資料庫索引都儲存在system.indexes集合中

//db.system.indexes.find()

 

//索引的修改

//db.c.ensureIndex({‘x‘ : -1}, {‘name‘ : ‘c_x_index‘, ‘background‘ : true})

//使用{‘background‘ : true}可以使這個過程在後台執行, 如果沒有添加那麼在建立索引的期間將阻止所有請求

 

//索引的刪除

//刪除資料庫liyang集合s的索引

//db.s.getIndexes()

//db.s.dropIndex(‘random_1‘)

 

 

 

 

 

//mongoDB第六章彙總筆記:

//MongoDB提供很強大的彙總工具,簡單的統計文檔的個數,複雜的可以利用Mapreduce做複雜的資料分析

 

//count()

//db.s.count()

//db.s.find({‘random‘ : {‘$lte‘ : 500, ‘$gte‘ : 490}}).count()

 

//distinct 用來查詢出給定鍵的所有不同的值,和關係型資料庫查詢一樣,必須指定集合和鍵

/*

db.people.remove()

for(i=1; i < 80; i++) {

db.people.insert({‘age‘ : i, ‘name‘ : ‘x‘+i})

}

//單個建之擷取不同的值

db.runCommand({‘distinct‘ : ‘people‘, ‘key‘ : ‘age‘})

*/

 

 

//group

//db.g.insert({‘user_id‘ : 1, ‘coin‘ : 5})
//db.g.insert({‘user_id‘ : 1, ‘coin‘ : 15})
//db.g.insert({‘user_id‘ : 2, ‘coin‘ : 15})
//db.g.insert({‘user_id‘ : 2, ‘coin‘ : 5})
/*
db.runCommand({
‘group‘ : {
‘ns‘ : ‘g‘,
‘key‘ : ‘user_id‘,
‘initial‘ : {‘total‘:0},
‘$reduce‘ : function(doc, prev) {
prev.total = prev.total + doc.coin
}
}
})
*/

/*
db.runCommand(
{
aggregate: "g",
pipeline: [
{ $group: { _id: "$user_id", total: { $sum: "$coin" } } },
{ $sort: { total: -1 } }
],
explain: false
}
)
*/


//ns 進行分組的集合

//key 文檔分組依據的鍵,所有相同的索引值將會劃分到一組

//initial 每一組reduce函數調用的初始值

//$reduce : function(doc, prev) {} 每個文檔都對應一次這個調用, 系統會傳遞兩個參數,當前文檔和累加器文檔

//condition user_id小於3個文檔

//Mapreduce是彙總中的明星,count distinct group 都可以實現
//使用Mapreduce的代價就是速度 group不是很快,MapReduce更慢,一般很少用到


//mongoDB第七章進階指南筆記:

//通過資料庫命令使用進階特性
//使用特殊的集合---固定大小的集合
//使用GridFS隱藏檔
//利用MongoDB對javascript的支援
//理解何為資料庫應用,何時該使用

//資料庫命令的工作原理
//db.g.drop() //返回TRUE 或 FALSE 實際上是
//db.runcommand({‘drop‘ : ‘g‘})
//db.runCommand({‘buildInfo‘ : 1}) //返回mongoDB的版本號碼和作業系統
//db.runCommand({‘collStats‘ : ‘c‘}) //返回指定集合的統計資訊
//db.runCommand({‘drop‘ : ‘test‘}) //刪除集合資訊 errmsg
//db.runCommand({‘isMaster‘ : 1}) //查詢服務器是主伺服器還是從伺服器
//db.runCommand({‘ping‘ : 1}) //檢測伺服器串連是否正常

//固定集合
//固定集合就是大小固定, 就像個環形的集合,插入新資料導致空間不足的時候會刪除更早的資訊
//建立固定集合的方法和普通的方法不一樣 可以指定集合的文檔的數量上限和集合的總容量
//db.createCollection(‘gd‘, {‘capped‘ : true, ‘size‘ : 10, ‘max‘ : 100000})
//建立集合100000個位元組, 文檔上限10個
//db.runCommand({‘collStats‘ : ‘gd‘})
//capped = true 表示集合大小固定


//伺服器端指令碼
//使用db.eval() 可以執行任意javascript的指令碼
//db.eval(‘return 10+5‘)
//db.eval(‘function(){ return 1+4}‘)

//備忘:只有傳遞參數的時候才必須使用封裝的函數, 參數通過db.eval的第二個參數傳遞
//db.eval("function(u) {return u;}", [‘apple‘]) //apple
//db.eval("function(data) {return ‘hello, ‘+data+‘‘;}", [‘dfdf‘])

//安全性
//執行javascript代碼,就必須考慮mongoDB的安全性,使用不慎就會發生類似關係型資料庫的注入是攻擊
//例如想列印使用者的使用者名稱就要把使用者名稱存放在username的欄位的變數中,
//var fun = "function(username){ return ‘hello ‘+username+‘‘}"
//db.eval(fun, [‘username‘])
//如果傳遞參數 ‘;db.dropDatabase(); 這樣整個資料庫就被清理乾淨了
//所以我們需要使用預留位置來替換   

mongoDB權威指南學習筆記

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.