Mongodb學習筆記速記(一)
一. 安裝mongodb
2. 在D盤新建資料夾 mongodb,複製解壓後的檔案到這裡
3. 把mongodb資料夾的路徑追加到系統變數path後面
4. 在D盤新建一個資料夾命名為mongodbData,用於存放mongodb的資料
5. 把開cmd,進入mongodb資料夾下的bin,執行: mongod –dbpathd:\mongodbData
6. 獲得埠號27017, 安裝完畢
二. 啟動mongodb
1. 建立快速啟動檔案mongodb.bat
d: && mongod--dbpath D:\MongodbData
2. 新建資料庫
建立快速檔案 mongodb27017.bat
mongo127.0.0.1:27017/admin
建立新資料庫 use [databasename] 如: use foobar
給指定資料庫新增集合並新增記錄 db.[documentName].insert({…})
db.persons.insert({name:”uspcat”})
db表示本資料庫,persons為集合
3. 檢視資料庫 show dbs
4. 檢視所有文件 show collections //persons(新建立) system.indexes (系統生成,負責儲存索引)
5. 查詢指定文件資料db.[documentName].find()
//查詢第一條 db.[documentName].findOne()
db.system.indexes.find()
//db.persons.find()
6. 更新文件db.[documentName].update({查詢條件},{更新內容}) ///$set 修改器
db.persons.update({name:”extjs4.0”},{$set:{name:”extjs4.1”}})
7. 刪除文件db.[documentName].remove({要刪除的物件})
db.persons.remove({age:1})
8. 刪除庫中的集合 db.[documentName].drop()
db.persons.drop()
9. 刪除資料庫db.dropDatabase()
10. Shell的help
全域性資料庫db.help()
集合 db.[documentName].help()
11. 資料庫和集合命名規範
不能是空字串
不得含有 ‘ ‘ (空格) 、‘,` % / \ 和空字元
應全部小寫
最多64個位元組
資料庫名不能和現有系統保留庫同名, 如 admin, local, config
12. 例外合法的命名(避免使用)
db-text 但是不能能過db.[documentName]得到,要改用db.getCollection(documentName),因為會被當作是減法操作
db.getCollection(“db-text”).text.insert({name:”mick”})
13. 內建js引擎,可以直接執行js(任何)程式碼
Function insert(object){
db.getCollection(“db-text”).text.insert(object)
}
Insert({age:32})
使用eval
db.eval(“return ‘uspcat’”)
三. 增刪改查
1. 插入文件db.[documentName].insert({})
db.persons.insert({_id:”001”,name:”yun”})
2. 批量插入文件(shell不支援批量插入, 要用for迴圈完成或者mongo驅動)
for(vari=0;i<10;i++){
db.persons.insert({name:i})
}
3. save操作 ( 當插入時遇到_id相同的情況,insert會報錯,而用save則會變成更新操作,把_id物件的內容替換.
db.persons.save({_id:”001”,name:i})
4. 刪除列表中所有資料db.[documentName].remove()
集合的本身和索引不會被刪除: show collections /db.system.indexes.find()
5. 根據條件刪除(刪除指定的資料 db. [documentName].remove(條件))
db.persons.remove({_id:1}))
(如果集合中要刪除的很多,建議刪除正合集合再重新建立)
6. 強硬的文件代換式更新操作(會用新的文件替換舊文件)
db.[documentName].update({查詢器},{修改器})
(如替換後的_id和現有的_id衝突,系統將報錯)
7. update的第三個引數 insertOrUpdate , 查詢器能查出來就更新,查不出來就插入
db.[documentName].update({查詢器},{修改器},true)
8. 批量更新操作 當查出多條資料時預設修改第一條資料,如要實現批量修改,需要第四個引數 db.[documentName].update({查詢器},{修改器},false,true)
四. 修改器
1. $set 用來指定一個鍵值,如果已存在就修改否則新增{$set{field:value}}
db.persons.update({name:4},{$set:{name:”uspcat”}})
2. $inc 只使用於數字型別, 他可以為指定的鍵對應的數字型別的數值進行加減操作{$inc:{field:value}}
db.persons.update({age:27},{$inc:{age:1}}) ////{“_id”:0“, age”:28}
3. $unset 刪除指定的鍵 {$unset:{field:1}}
db.persons.update({age:28},{$unset:{age:1}})
4. $push 如指定的鍵是陣列則追加,否則中斷報錯,如果不存在則建立陣列 {$push:{field:value}}
db.persons. update({_id:5},{$push:{books:”JS”}})
5. $pushAll 批量新增陣列資料, 用法與$push類似 {$pushAll:{field:array}}
db.persons.update({_id:5},{$pushAll:{books:[“EXTJS”,”JS”]}})
6. $addToSet 往指定鍵值的陣列新增, 當目標陣列存在則不操作,不存在則新增 {$addToSet:{field:value}}
{$addToSet:{books:”JS”}}
7. $pop 從指定陣列刪除一個值 1 表示刪除最後一個值, -1表示刪除第一個值{$pop:{field:value}}
{$pop:{name:1}}
8. $pull 刪除被指定的值 {$pull:{field:value}}
{$pull:{“book”:”JS”}}
9. $pullAll 一次性刪除多個指定的數值 {$pullAll:{field:arry}}
{$pullAll:{“name”:[“JS”,”JAVA”]}}
10. 陣列定位器($) 如值內有多個數組,只想操作一部份
{name:”YFC”,age:27,books:[{type:”JS”,name:”EXTJS4”},{type:”JS”,name:”JQUERY”}]}
要向type為JS的文件增加一個作者 author:USPCAT
db.text.update({“books.type”:”JS”},{$set:{“books.$.author”:”USPCAT”}})
上面提到的修改器,都是放在物件的前面{$set:{“books.$.author”:”USPCAT”}},後面要學的查詢器是放到物件內層
11. 批量陣列更新 $addToSet與 $each結合db.text.update({_id:100},{$addToSet:{books:{$each:[“JS”,”DB”]}}})
$each會迴圈後面的陣列把每一個數值進行$addToSet操作
12. 記憶體分配與查詢效率
Document被建立的時候,DB為其分配記憶體和預留記憶體,當修改操作不超過預留記憶體的時候,速度非常快,如果超過了則會分配新的記憶體而消耗時間.
五. mongoDB的特殊函式 (runCommand函式專門用於執行特殊函式)
1. findAndModify 特殊函式,用於返回update或remove後的文件,一次只能處理一個文件,也不能執行upsert操作,只能更新已有文件.
runCommand({“findAndModify”:”processes”,query:{查詢器},sort{排序},new:true}).value///update:{更新器},remove:true
ps=db.runCommand({
“findAndModify”:”persons”, //指定資料集合
“query”:{“name”:”text”}, //查詢物件,只能針對單文件
“update”:{“$set”:{“email”:”1221”}}, //修改器
“new”:true //
}).value
Do_something(ps)
六. 查詢
1. 指定返回的鍵
db.[documentName].find({條件},{鍵指定})
資料準備->persons.json
查詢所有資料的指定鍵(name,age,country)
db.persons.find({},{name:1,age:1,countru:1,_id:0}) // 1表示查詢, 0表示不查
2. 查詢條件 (為空表示不限條件)
$lt < {age:{$gte:22,$lte:27}} ///大於等於22,小於等於27
$lte <=
$gt >
$gte >=
$ne != {age:{$ne:26}}
db.persons.find({age:{$gte:25,$lte:27}},{_id:0,name:1,age:1}) //查詢年齡在25至27之間
db.persons.find({country:{$ne:”Korea”}},{_id:0,m:1}) //查詢不是韓國的學生的數學成績
3. $in 或 $nin (包含或不包含)
db.persons.find({country:{$in:[“USA”,”China”]}}) //查詢中國和美國的學生
db.persons.find({country:{$nin:[“USA”,”China”]}}) //查詢非中國和美國的學生
4. $or查詢
db.persons.find({$or:[{cn:{$gt:85}},{en:{$gt:90}}]},{_id:0,e:1,c:1,name:1})
//查詢語文成績大於85 或者英語成績大於90的學生
5. null 查詢此項為null的資訊
db.persons.find({sex:{$in:[null]}},{_id:0,name:1,sex:1})
//查詢性別為null的學生
6. 使用正則查詢
db.persons.find({name:/li/i},{_id:0,name:1}) //查詢名字中存在li的學生
7. $not 可以用在任何地方進行取反操作
db.persons.find({name:{$not:/li/i}},{_id:0,name:1})
//$not和$nin的區別是,$not可以用在任何地方,$nin只用在集合上
8. 陣列查詢$all和index應用
//查詢所有喜歡MONGODB和JS的學生
db.persons.find({books:{$all:[“MONGODB”,”JS”]}},{books:1,_id:0})
//查詢第二本書是JAVA的資訊
db.persons.find({“books.1”:”JAVA”},{_id:0,name:1})
9. 查詢指定長度陣列$size, 不能與比較查詢符一起使用()
//查詢喜歡書籍數量為4本的學生
db.persons.find({books:{$size:4}},{_id:0,name:1})
//查詢喜歡書籍大於3本的學生
//1.增加欄位用於統計
db.persons.update({},{$set:{size:4}},false,true)
//2.改變書籍的更新方式,每次增加書籍時,size加1
db.persons.update({name:”jim”},{$push:{books:”ORACLE”},$inc:{size:1}})
//3.利用$gt查詢
db.persons.find({size:5},{_id:0,name:1,sex:1}) //db.persons.find({size:{$gt:3}})
//利用shell查詢Jim喜歡看的書的數量
var persons =db.persons.find({name:”Jim”}) //多個
while(persons.hasNext()){ //遍歷郵標
obj=persons.next();
print(obj.books.length)
}
Shell是個徹底的JS引擎,但是一些特殊的操作要靠各個驅動來完成(JAVA,NODEJS)
10. $slice操作符返回文件中指定陣列的內部值
//查詢Jim書架中第二至四本書
db.persons.find({name:”Jim”},{books:{$slice:[1,3]},_id:0})
//查詢最後一本書
db.persons.find({name:”Jim”},{books:{$slice:-1},_id:0})
11. 文件查詢
為Jim新增學習簡歷文件 jim.json
//查詢出在K學校上過學的學生
//問題1 侷限,用絕對匹配可以完成,完全匹配,查詢順序也要一致
db.persons.find({school:{school:”K”,score:”A”}},{_id:0,school:1})
//問題2 順序問題可以用 物件”.” 的方式定位,但是會附帶陣列內其他元素的查詢score
db.persons.find({“school.score”:”A”,”school.school”:”K”},{_id:0,school:1})
//正確做法,使用單條條件組查詢$elemMatch,會將查詢條件當成一個組合,進行遍歷,只有滿足組合所有條件的
db.persons.find({school:{$elemMatch:{school:”K”,score:”A”}}},{_id:0,school:1})
12. $where 查詢複雜資訊,萬能查詢,但是會消耗效能,儘量減少使用
//查詢年齡大於22歲,喜歡看C++書,在K學校上過學的學生
db.persons.find({“$where”:function(){
//得到查詢文件的每一條文件
var books=this.books;
//得到文件中的school物件
var school=this.school;
if(this.age>22){
var php=null;
//遍歷書籍
for(var i=0;i<books.length;i++){
if(books[i]==”C++”){
php=books[i];
//如果學校為真
if(school){
for(varj=0;j<school.length;j++){
//判斷是否在K上過學
if(school[j].school==”K”){
return true;
}
}
break;
}
}
}
}
}})