1:查詢 注意:mongodb對數值的字符串,和數值類型有嚴格的區分 字符串也可以比較大小
基本語法:db.集合名稱.find({查詢條件},{顯示的字段}); //後面的顯示的字段可以省略 默認全部顯示 顯示的字段的格式 {"_id":0/1,"name":0/1} 0 表示不顯示 1 表示顯示
db.集合名稱.find().pretty() //格式化顯示 就是好看 在列多的時候就不再一行顯示的就是一個對象一個對象的顯示
條件操作符:
-
(>) 大於 - $gt
-
(<) 小於 - $lt
-
(>=) 大於等於 - $gte
-
(<= ) 小於等於 - $lte
-
= 等於 {k:v}或 $eq
ex : db.student.find( { "age": { "$gt":19
} } ); //查詢年齡大於19歲的學生
db.student.find(
{ "age": { "$gt":19 ,"$lt":21 } } ); //查詢年齡大於19,小於20歲的學生
邏輯運算:
與 $and
或 $or
非 $nor
ex : db.student.find({"$or":[
{"age":{"$gt":19}},
{"score":{"$lt":90}}
]})
//查詢age大於19 或則 分數 小於90 的學生
ex : db.student.find({"$nor":[
//看清楚了是$nor
{"age":{"$gt":19}},
{"score":{"$lt":90}}
]}) //查詢age大於19 或則 分數 小於90 的學生
求模運算
語法 : {"$mod":[20,1]} // 模20餘1的數字
ex : db.student.find( {"age":{"$mod":[20,1]
} } ) //查詢模20餘1 的學生
範圍查詢: $in $nin
ex: db.stu.find({ "name": { $in :[ "張三", "李四" ,"王五"
] } }) //查詢名字爲張三李四王五的人
db.stu.find({$or:[
{name:"張三"},
{name:"李四"}
]})
數組查詢 $all $size $slice $elemMatch
ex: db.stu.find({ "course": { $all : ["語文","數學"]
} }); //查詢學生中課程包含語文和數學的學生 -- course 是數組
db.stu.find( { "addr" :{ $all : [ "浙江杭州"
] } } ) //這樣也行 //addr 可不是數組
利用index下表從0開始
db.stu.find( { "course.1"
: " 數學 "} ) //查詢course數組中第二個是數學的人
db.stu.find( { "course" : { $size : 2 }
} ) // 查詢數組長度爲2的人
db.stu.find( {"age" : 19} , { course :
{ $slice : 2 } } ) //只打印數組前兩個的信息 可以是 -2 取後兩個的信息
db.stu.find
( {"age" : 19 } , {course : {$slice : [ 1, 2 ] } } ) //取中間的信息 -- 含頭不含尾
嵌套集合查詢 parents 是數組 數組裏面是對象 裏面有 Job
db.stu.find( { parents : { $elemMatch : { job
: "局長" } } } ) //查詢學生父母中有是局長的
注意
: 別弄複雜的數據
字段的判斷: $exists
ex: db.stu.find( { "course" : { $exists : true }
} ) //查詢含有course字段的數據
db.stu.find ( { "course" : { $exists : false
} } ) //查詢不含有course 字段的數據
where條件過濾 -- 不建議用 索引不起作用
但能支持js語法
ex: db.stu.find( {$where : "this.age>20 " } )
//查詢age 大於20的學生
db.stu.find("this.age>20") //簡化版
db.stu.find($where:function(){
return this.age>20
})
db.stu.find (function(){
return this.age>20;
})
模糊查詢 -- 正則運算
基礎語法 : {key : 正則標記}
完整語法 : { key : { $regex : 正則標記 , $options :
選項 } }
options i:忽略大小寫
m : 多行查找
x : 空白字符串除了被轉移的或在字符內中以外的完全被忽略
s : 匹配所有的字符( .)包括換行
注意 如果直接使用則只能使用 i 和M
想用其他的就要用 $regex
ex: db.stu.find( {"name" : / 陳 / } ) //查詢名字包含陳的
學生
db.stu.find( {"name" : / a / i } )
//忽略大小寫 i 對中文肯定是無效的
db.stu.find( {name : { $regex : / a
/i } } )
數據排序 1升序 -1降序
ex: db.stu.find().sort(
{ "score" : -1 } ) //查詢分數並降序排列
自然排序 -- 先後順序
ex : db.stu.find().sort( {" $natural " : -1}
) //從後往前排
數據分頁顯示
skip ( n ) : 表示跨過多少數據
limit ( n ) : 取出的數據個數限制
ex : db.stu.find().skip(0).limit(5)
//取出前5個
db.stu.find().skip(0).limit(5).sort( { "age"
: -1 } ) //
db.stu.find().skip(5).limit(5).sort( {"age
" : -1 } )
2 : 數據的更新 -- 比較麻煩 建議 刪掉重新插入 $set -- 更新操作符
語法: db.集合.update(更新條件 , 新的對象數據 , upsert , multi )
upsert : 如果更新的數據不存在就增加 ( true , false)
multi : 是否只更新第一條數據 (true : 全更新, false : 第一條)
ex : db.stu.update ( {age : 19} , { "$set" : { "score" : 100 } } ,false , true ) //
修改器 -- 像$set 一樣
$inc :主要針對於一個數字字段,增加某個字段段落的數據內容;
語法: { $inc : { "成員" : 內容 } }
ex : db.stu.update ( { "age" : 19 } , { $inc : {score : -30 ,age : +1}} , false , true) //分數-30 age +1歲
$set:進行內容的重新設置;
語法: {$set : {"成員" : "新內容" } }
ex: db.stu.update ( {"age":20} , {$set : {score : 89}} , fasle ,true) //修改分數爲89
$unset : 刪除某個成員的內容;
語法:{ $unset :{"成員" : 1} }
ex: db.stu.update({"name":"張三"} , {$unset : { score : 1 , age: 1 } }) //刪除字段score和age
$push: 相當於將內容追加到指定的成員之中 ( 基本上是數組 ) -- 只能增加一個 若是寫兩個就是數組裏面套數組
語法: { $push : { 成員 : value} }
ex: db.stu.update ( {name : "張三" } , {$push : { "course " : ["體育"] } } ) //往課程裏面加課程
如果沒有數組就創建,如果有就添加
$pushAll :追加多個內容
語法: { $pushAll : { 成員 : 數組內容} }
ex: db.stu.update ( {name : "張三" } , {$push : { "course " : ["體育" , "美術"] } } ) // 一次添加多個
$addToSet: 向數組裏面增加一個新的內容,只有不存在的時候添加
語法 : { $addToSet : { 成員 : 內容} } //內容不能是數組 若是數組 就是添加數組了
ex: db.stu.update( { name : "王五" } , {$ addToSet : { course : "體育" } } ) //不存在體育則增加,存在則不管
$pop : 刪除數組的內容:
語法:{ $pop:{成員 : 內容 } } 內容-1 刪除第一個 1 刪除最後一個
ex: db.stu.update( {name:"王五"} , { $pop : { course : -1 } } )
$pull : 從數組內刪除一個指定內容的數據
語法: { $pull : { 成員 : 內容 } } //有就刪除 沒有就算了
ex: db.stu.update({name : "王五"} , { course : "音樂" } )
$pullAll : 一次刪除多個內容
語法: { $ pullAll : {成員 : [ "數學" ,"語文" ] } }
ex: db.stu.update( {name : " 王五"} ,{ $pullAll : { course : ["數學" ,"語文"] } } )
$rename : 爲成員名稱重命名
語法: { "$rename" : { 舊的成員名稱 : 新的成員名稱 } }
ex: db.stu.update( { "name " : "張三" } , { $rename : { "name" : "姓名" } } )
3:刪除數據
db.stu.remove( { 條件} , 是否只刪一個 ) // true/false 1/0
ex: db.stu.remove( {} )//刪除全部
db.stu.remove ( {"name" : "王五"} , true ) //只刪除一個
db.stu.drop() //刪除集合
4:遊標
遊標就是指的數據可以一行一行的進行操作,只需用find()函數就可以返回遊標
hasNext() //判斷是否有下一條數據
next();//讀取一條數據
ex : var cursor=db.stu.find()
cursor.hasNext();
cursor.next();
while(cursor.hasNext()){
var doc=cursor.next();
print(doc.name); //控制檯輸出。。不是console
printjson(doc);//用Json輸出
}
5.索引
查詢默認情況下的索引
db.stu.getIndexes();
自定義索引
語法:db.集合名稱.ensureIndex( {列 : 1 } ) //升序 -1 爲降序
ex: db.stu.ensureIndex ( {age : -1} )
刪除檢索
db.news.dropIndexes();
設置唯一索引
ex: db.stu.ensurIndex( { "name" : 1 } , { "unqiue" : true} ) //name 字段上的內容不許重複 name:1 表示建立索引
設置過期索引
對於文檔應有time --存時間的字段
db.phones.insert( {"tel":110,code:110,time : new Date() } )
ex:db.phones.ensureIndex( {time:1 } ,{ expireAfterSeconds : 10 } ) //設置文檔10s後過期,但是時間不準,可以進行臨時數據保存
全文檢索
設置全文檢索
db.news.ensureIndex( {"title" : "text" , " content" : "text " } ) //text 就是設置字段的全文檢索
使用全文檢索 “$text” 查詢 "$search"
|--查詢指定關鍵字 {$search : " 查詢關鍵字"}
|--或的關係 { $search : "查詢關鍵字 查詢關鍵字 。。。" }
|--與的關係 { $search : " \"查詢關鍵字\" \"查詢關鍵字\" ..." }
|--排除某一個 {$search : " 查詢關鍵字 查詢關鍵字。。。 - 排除關鍵字"}
ex: db.stu.find( "$text" : {$search : "查詢關鍵子 查詢關鍵字 "})
一次設置所有爲全文檢索
db.news.ensureIndex( {"$**": "text" } )
打分查詢
ex: db.stu.find( "$text" : {$search : "查詢關鍵子 查詢關鍵字 "},{score : {$meta : textScore } } ) //分值越高越好
db.stu.find( "$text" : {$search : "查詢關鍵子 查詢關鍵字 "},{score : {$meta : textScore } } ).sort(
{score : {$meta : textScore } } )