MongoDB數(shù)據(jù)的增刪改查
說到MongoDB的增刪改查我碟,首先要知道MongoDB中的三要素
- 數(shù)據(jù)庫瞻凤,相似于mysql中的數(shù)據(jù)庫
- 集合肥隆,相似于mysql中的表
- 文檔站绪,相似于mysql中表的記錄
一、插入數(shù)據(jù)
-
db.集合名稱.insert(document)
db.stu.insert({name:'小龍女',gender:1}) db.stu.insert({_id:"20170101",name:'劉德華',gender:1})
插入文檔時(shí)遂鹊, 如果不指定_id參數(shù)振乏, MongoDB會為文檔分配一個(gè)唯一的ObjectId類型的_id
插入單條指定為字典, 插入多條時(shí)需要指定為列表
保存
db.集合名稱.save(document)
如果文檔的_id已經(jīng)存在則修改, 如果文檔的_id不存在則添加
- save區(qū)別于insert: insert中文檔的_id已經(jīng)存在如果存在直接報(bào)錯(cuò)
二秉扑、查詢:
- 簡單查詢:db.集合名稱.find()
高級查詢
查詢數(shù)據(jù)準(zhǔn)備
db.stu.drop() db.stu.insert({_id : 1, name:'郭靖',hometown:'蒙古',age:20,gender:true}) db.stu.insert({_id : 2, name:'黃蓉',hometown:'桃花島',age:18,gender:false}) db.stu.insert({_id : 3, name:'華箏',hometown:'蒙古',age:18,gender:false}) db.stu.insert({_id : 4, name:'黃藥師',hometown:'桃花島',age:40,gender:true}) db.stu.insert({_id : 5, name:'段譽(yù)',hometown:'大理',age:16,gender:true}) db.stu.insert({_id : 6, name:'段王爺',hometown:'大理',age:45,gender:true})
數(shù)據(jù)查詢
-
方法find(): 查詢
- db.集合名稱.find({條件文檔})
-
方法findOne():查詢慧邮,只返回第一個(gè)
- db.集合名稱.findOne({條件文檔})
-
方法pretty(): 將結(jié)果格式化
- db.集合名稱.find({條件文檔}).pretty()
舉例:
//查找所有女生
db.stu.find({gender:false})
//查找一個(gè)女生
db.stu.findOne({gender:false})
// 查找所有的女生并格式化顯示
db.stu.find({gender:false}).pretty()
比較運(yùn)算符
- 等于: 默認(rèn)是等于判斷, 沒有運(yùn)算符
- 小于:$lt (less than)
- 小于等于:$lte (less than equal)
- 大于:$gt (greater than)
- 大于等于:$gte
- 不等于:$ne
- 舉例:
// 查找年齡等于18歲的學(xué)生
db.stu.find({age:18})
// 查找年齡小于18歲的學(xué)生
db.stu.find({age:{$lt: 18}})
// 查找年齡小于等于18歲的學(xué)生
db.stu.find({age:{$lte: 18}})
// 查找年齡大于18歲的學(xué)生
db.stu.find({age:{$gt: 18}})
// 查找年齡大于等于18歲的學(xué)生
db.stu.find({age:{$gte: 18}})
// 查找年齡不等于18歲的學(xué)生
db.stu.find({age:{$ne: 18}})
邏輯運(yùn)算符
-
and:在json中寫多個(gè)條件即可
查詢年齡大于或等于18舟陆, 并且性別為true的學(xué)生
db.stu.find({age:{$gte:18},gender:true})
-
or:使用$or误澳, 值為數(shù)組, 數(shù)組中每個(gè)元素為json
查詢年齡大于18秦躯, 或性別為false的學(xué)生
db.stu.find({$or:[{age:{$gt:18}},{gender:false}]})
-
混合查詢
查詢年齡大于18或性別為男性忆谓, 并且家鄉(xiāng)為大理
db.stu.find({$or:[{age:{$gte:18}},{gender:true}],hometown:'大理'})
范圍運(yùn)算符
- "$in" : 判斷在某個(gè)范圍內(nèi)
- "$nin" 判斷不在某個(gè)范圍內(nèi)
-
查詢年齡為18或20的學(xué)生
db.stu.find({age:{$in:[18,20]}})
-
查詢年齡為不為18或20的學(xué)生
db.stu.find({age:{$nin:[18,20]}})
-
支持正則表達(dá)式(了解)
使用//或$regex編寫正則表達(dá)式
-
查詢姓黃的學(xué)生
-
db.stu.find({name:/^黃/})
- 上面這種寫法在pymongo中不支持
-
db.stu.find({name:{$regex: '^黃' }})
- 該寫法pymongo中支持
-
limit和skip
方法limit(): 用于讀取指定數(shù)量的文檔
-
語法: db.集合名稱.find().limit(NUMBER)
- 查詢2條學(xué)生信息
db.stu.find().limit(2)
方法skip(): 用于跳過指定數(shù)量的文檔
-
語法: db.集合名稱.find().skip(NUMBER)
- 跳過三個(gè)學(xué)生,查詢后面的
db.stu.find().skip(3)
查詢學(xué)生信息跳過3個(gè)學(xué)生, 再查詢2個(gè)學(xué)生
-
同時(shí)使用:
db.stu.find().limit(2).skip(3)
- 或
-
db.stu.find().skip(3).limit(2)
(推薦)
自定義查詢(了解)
- 使用$where后面寫一個(gè)函數(shù), 返回滿足條件的數(shù)據(jù)
- 舉例
- 查詢年齡大于30的學(xué)生
db.stu.find({
$where:function() {
return this.age>30;}
})
- 注意: 必須使用 return 返回一個(gè)值
投影
在查詢到的返回結(jié)果中踱承, 只選擇必要的字段
-
語法: db.集合名稱.find({},{字段名稱:1,...})
- 參數(shù)為字段與值倡缠, 值為1表示顯示, 值為0不顯示, 普通字段不寫就是不顯示
特殊: 對于_id列默認(rèn)是顯示的茎活, 如果不顯示需要明確設(shè)置為0, 其他字段不顯示不寫即可
舉例:
-
查詢所有學(xué)生信息,只顯示姓名和年齡
-
db.stu.find({},{name:1,age:1})
- 查詢的結(jié)果,除了name,age外還有_id類型
-
如何去掉_id字段呢? , 在投影中給_id指定為0
db.stu.find({},{_id:0, name:1, age:1})
-
排序
方法sort()昙沦, 用于對 集進(jìn)行排序
-
語法: db.集合名稱.find({文檔條件}).sort({字段:1,...})
- 參數(shù)1為升序排列
- 參數(shù)-1為降序排列
舉例:
-
查詢所有學(xué)生,按年齡升序
db.stu.find().sort({age:1})
-
查詢所有學(xué)生,按年齡降序
db.stu.find().sort({age:-1})
-
根據(jù)性別降序, 再根據(jù)年齡升序
db.stu.find().sort({gender:-1,age:1})
統(tǒng)計(jì)個(gè)數(shù)
方法count()用于統(tǒng)計(jì)結(jié)果集中文檔條數(shù)
-
語法: db.集合名稱.find({條件}).count()
- db.集合名稱.count({條件})
舉例:
-
查詢男生的個(gè)數(shù)
db.stu.find({gender:true}).count()
db.stu.count({gender:true})
-
統(tǒng)計(jì)年齡大于20的男生的個(gè)數(shù)
db.stu.count({age:{$gt:20},gender:true})
消除重復(fù)
方法distinct()對數(shù)據(jù)進(jìn)行去重
db.集合名稱.distinct('去重字段',{條件})
舉例:
-
查詢學(xué)生的家鄉(xiāng),不能重復(fù)
db.stu.distinct('hometown')
-
查詢年齡大于20的學(xué)生的家鄉(xiāng), 不能重復(fù)
db.stu.distinct('hometown',{age:{$gt:20}})
三载荔、更新修改
-
語法: db.集合名稱.update( , , {multi: })
參數(shù)query:查詢條件
參數(shù)update:更新操作符
參數(shù)multi:可選盾饮, 默認(rèn)是false,表示只更新找到的第一條記錄懒熙, 值為true表示把滿足條件的文檔全部更新
-
舉例:
-
db.stu.update({name:'hr'},{name:'mnc'}) 更新一條,沒有更新的字段會丟棄.
db.stu.update().png db.stu.update({name:'hr'},{$set:{name:'hys'}}) 更新一條,沒有更新的字段不會丟棄.
db.stu.update({},{$set:{gender:0}},{multi:true}) 更新全部
-
注意:"multi update only works with $ operators" 更新全部,必須使用$set
四丘损、刪除
-
語法: db.集合名稱.remove(,{justOne: })
參數(shù)query:可選,刪除文檔的條件
參數(shù)justOne:可選煌珊, 如果設(shè)為true或1号俐, 則只刪除一條, 默認(rèn)false定庵, 表示刪除多條