標籤: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權威指南學習筆記