MongoDB day02
?
1、非關系型數據庫和關系型數據庫比較
1. 不是以關系模型構建的,結構自由
2. 非關系型數據庫不保證數據的一致性
3. 非關系型數據庫可以在處理高并發和海量數據時彌補關系型數據庫的不足
4. 非關系型數據庫在技術上沒有關系型數據庫成熟也沒有sql語句的操作
2、mongoDB文檔型數據庫
創建數據庫: use databaseName
刪除數據庫: db.dropDatabase()
創建集合: db.createCollection() / db.collection.insert()
刪除集合: db.collection.drop()
重命名集合: db.collection.renameCollection()? /??db.getCollection()
查看數據庫: show dbs
查看集合: show tables /? ?show collections
插入文檔: insert() / save()
3、文檔 bson www.mongodb---->docs查看文檔幫助
#######################################################################################
查找操作:
mysql: select ... fron table where ...
mongo: db.collection.find(query,field)
參數:query 篩選條件,相當于where字句(鍵值對)
field 選擇要展示的域(鍵值對)
db.collection.find() ----》select * from table
query:以鍵值對的形式給出查找條件
e.g. db.class0.find({name:'Lucy'})
field: 以鍵值對的形式給出要展示(不要展示的域)
域名為鍵,0為值表示不顯示該域;1為值表示顯示該域
e.g.?db.stu.find({},{_id:0})
* 如果使用0設置某些域不顯示則默認其他域顯示;如果使用1設置某些域顯示則默認其他域不顯示
* ——ID比較特殊,只有設置為0才不顯示否則默認顯示,
* 除了ID域,其他的域必須同時設置為0或者1
* 如果不寫改參數,則默認顯示所有內容
e.g. db.stu.find({sex:'m'},{_id:0,name:1,age:1})
?
findOne(query,field)
功能:查找符合條件的第一條文檔
參數:同find
返回值:查找到的文檔
e.g. db.class0.findOne({age:17},{id:0}) # 只顯示第一條文檔
query更豐富的用法
操作符;使用$號注明的第一個特殊意義字符串,表達某個特定含義,比如$gt表示大于
比較操作符
$eq 等于 e.g. db.stu.find({age:{$eq:18}},{_id:0})
$lt 小于 e.g. db.stu.find({age:{$lt:28}},{_id:0})
字符串也能進行比較 e.g. db.class0.find({name:{$lt:'Tom'}},{_id:0})
$lte 小于等于 <= db.stu.find({age:{$lte:27}},{_id:0})
$gt 大于 > db.class0.find({age:{$gt:17}},{_id:0})
$gt 大于等于 >= db.class0.find({age:{$gte:17}},{_id:0})
$ne 不等于 != e.g. db.class0.find({age:{$ne:17}},{_id:0})
$in 包含 e.g.查找年齡在[16 18]中的 db.class0.find({age:{$in:[16,18]}},{_id:0})
$nin 不包含 e.g.? 不是16 17的都找到 db.class0.find({age:{$nin:[16,17]}},{_id:0})
邏輯操作符
$and 邏輯與
* query 中如果多個條件用逗號隔開即為and關系
e.g.年齡為17并且為男 db.class0.find({age:17,sex:'m'},{id:0})
e.g.年齡大于13并且小于18 db.class0.find({age:{$gt:13,$lt:18}},{_id:0})
$or 邏輯或
e.g.? 年齡大于30或性別為女 db.class1.find({$or:[{age:{$gt:30}},{sex:'w'}]},{_id:0})
$not 邏輯非
年齡不等于17 db.class0.find({age:{$not:{$eq:17}}},{_id:0})?
$nor 既不也不
e.g.? 查找年齡不等于17,性別不為男的 db.class0.find({$nor:[{age:17},{sex:'m'}]},{_id:0})
條件混合
(年齡大于30 并且叫阿寶) 或者 性別為 w db.class1.find({$or:[{age:{$gt:30},name:'阿寶'},{sex:'w'}]},{_id:0})
(年齡小于30或者大于33) 并且? 性別為 w db.class1.find({$or:[{age:{$lt:30}},{age:{$gt:33}}],sex:'w'},{_id:0})
數組
表達 : 使用中括號將一定的數據組織成一種數據結構
* 數組是有序的;數組中的數據類型可以不同
e.g.? 數組值中只要有任意一項大于90即可 db.class2.find({score:{$gt:90}},{_id:0})
$ size 通過數組中元素的個數查找
e.g.? ?查找數組中包含兩項的文檔 db.class2.find({score:{$size:2}},{_id:0})
$all 查找數組中同時包含多項的文檔
e.g. 數組中同時包含88和90 db.class2.find({score:{$all:[88,90]}},{_id:0})
$slice 取數組的部分進行顯示,在field中聲明
e.g.? 顯示數組中前兩項 db.class2.find({},{_id:0,score:{$slice:2}})
e.g.? ?跳過第一項顯示后面兩項 db.class2.find({},{_id:0,score:{$slice:[1,2]}})
其他query查詢
$exixts
判斷一個與是否存在
e.g. 查找有sex域的文檔(true表示存在,false表示不存在) db.class0.find({sex:{$exists:true}},{_id:0})
$mod 余數查找
e.g. 除以2余1的 db.class0.find({age:{$mod:[2,1]}},{_id:0})
$type 數據類型查找
e.g. 查找age值類型是1的 db.class1.find({age:{$type:1}},{_id:0})
操作符用法文檔查找
www.mongodb.com ---> docs ---->search
查找結果的進一步操作
?
distinct() 查看集合中某個域的取值范圍
e.g. 查看年齡的取值范圍 db.class1.distinct('age')
pretty() 將查詢結果格式化顯示
e.g. db.class1.find().pretty()
limit(n) 顯示查找結果的前n條文檔
e.g. 顯示查找到的文檔的前3條 db.class1.find({},{_id:0}).limit(3)
skip(n) 跳過前n條顯示后面的內容
e.g. 跳過查找到的前三條,顯示后面的內容 db.class1.find({},{_id:0}).skip(3)
count() 計數統計
e.g. 統計查找數量 db.class1.find({},{_id:0}).count()
sort({field:1/-1}) 對查找結果排序
參數 : 以鍵值對形式給出,鍵表示按照哪個域排序;1表示升序,-1表示降序
e.g. 對查找結果按照年齡升序排序 db.class1.find({},{_id:0}).sort({age:1})
復合排序: 當第一排序項相同的時候按照第二排序項排序,以此類推
e.g. 當年齡相同時,按照姓名進行排序 db.class0.find({},{_id:0}).sort({age:1,name:1})
函數的連續調用
當一個函數的返回結果仍然是文檔集合的時候可以連續調用函數
e.g. 查看年齡最小的三個文檔 db.class1.find({},{_id:0}).sort({age:1}).limit(3)
文檔刪除操作
mysql : delete from table where ...
mongodb : db.collection.remove(query,justOne)
remove(query,justOne) 刪除文檔
參數 : query 篩選要刪除的文檔,相當于where;用法同 查找
justOne 布爾值
默認為False 表示刪除所有復合條件的文檔;如果設置為true 則表示只刪除第一條復合條件文檔
e.g. 刪除年齡域值不是數字類型的 db.class1.remove({age:{$not:{$type:1}}})
e.g. 刪除第一個年齡為17的文檔 db.class0.remove({age:17},true)
刪除一個集合中所有文檔 db.collection.remove({})
e.g. 刪除class0中所有文檔 db.class0.remove({})
練習:
1、創建數據庫 名字 grade use grade
2、數據庫中創建集合 名字 class
3、集合中插入若干文檔格式如下
{name:'zhang',age:10,sex:'m',hobby:['a','b'......]}
年齡在4-13之間
hobby幾項都可以,可選項:draw sing dance?baskeball dootball pingpong running computer
db.class.insert({name:'zhang',age:10,sex:'m',hobby:['a','b'...]})
4、查詢練習
查看班級所人信息 find()
查看年齡大于10歲的學生信息 find({age:{$gt:10}})
查看年齡 8-11 歲之間的學生信息 find({age:{$gt:8,$lt:11}})
找到年齡9歲且為男生的學員 find({age:9,sex:'m'})
找到年齡小于7歲或者大于11歲的學生 find({$or:[{age:{$gt:11}},{age:{$lt:7}}]})
找到年齡8歲或者11歲的學生 find({age:{$in:[8,11]}})
找到有兩項興趣愛好的學生 find({hobby:{$size:2}})
找到喜歡computer的學生 find({hobby:"computer"})
找到既喜歡畫畫,又喜歡跳舞的學生 find({hobby:{$all:['draw','dance']}})
統計興趣愛好有3項的學生人數 find({hobby:{$size:3}}).count()
找到本班年齡第二大的學生 find({}).sort({age:-1}).skip(1).limit(1)
查看學生學生興趣愛好的范圍 db.class.distinct('hobby')
找到年齡最小的三個同學 find({}).sort({age:1}).limit(3)
刪除雖有年齡小于6歲或者大于12歲的學員 remove({$or:[{age:{$lt:6}},{age:{$gt:12}}]})
?修改操作
?mysql : update table set ... where ...?
mongodb : db.collection.update(query,update,upsert,multi)
功能 : 修改文檔
參數 : query? 篩選要修改的文檔,相當于where用法同查找
update :將篩選的文檔修改為什么內容,相當于set。 需要配合修改操作符一同使用
upsert : bool值,默認為false。如果query的文檔不存在則不進行任何操作
? ? ? ? ?如果設置為true則如果query的文檔不存在就根據query和update插入新文檔
multi : bool值,默認為false。如果query文檔有多條則只修改第一條
? ? ? ? ?如果設置為true 則修改所有符合條件文檔
e.g.? 將小白年齡改為31 db.class1.update({name:'小白'},{$set:{age:31}})
e.g. 修改文檔,如果文檔不存在則插入 db.class1.update({name:'阿蓉'},{$set:{age:29}},true)
e.g.? 如果有多個年齡小于32的則全部修改 db.class1.update({age:{$lt:32}},{$set:{age:28}},false,true)
?
作業:練習查找、刪除操作、記憶操作符使用;回顧文檔的查找方法;將課上練習再進行熟練。??
?
總結
以上是生活随笔為你收集整理的MongoDB day02的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度地图获取规划路径信息
- 下一篇: MATLAB 实现滑轮运转 动态