mongodb基本指令与高级查询指令以及聚合命令
一、MongoDB中關于database的基本指令
1 ###關于database的基本指令 2 #查詢當前使用的數據庫指令 3 db 4 5 #查詢所有的數據庫指令 6 show dbs#或者:show databases 7 8 #切換數據庫指令 9 use db_name 10 11 #刪除當前數據庫指令 12 db.dropDatabase()二、MongoDB中關于集合的創建及基本增刪改查指令
1、集合創建(集合相當于mysql里的表)
1 ###不手動創建集合 2 #向不存在的集合中第一次加入數據時,集合會被創建出來 3 4 ###手動創建集合 5 db.createCollection(name,options) 6 7 #例如創建集合test 8 db.createCollection(test) 9 10 db.createCollection(test,{capped:true,size:10}) 11 #參數capped:默認值為false表示不設置上限,值為true表示設置上限;參數size:當capped值為true時,需要指定此參數,表示上限大小,當文檔達到上限時,會將之前的數據覆蓋,單位為字節 12 13 #查看集合 14 show collections 15 16 #刪除集合 17 db.collection_name.drop()2.集合中的數據類型
1、Object ID :文檔ID
2、String:字符串,最常用,必須是有效的UTF-8
3、Boolean:存儲一個布爾值,True或false
4、integer:整數可以是32位或64位,取決于服務器
5、Double:存儲浮點值
6、Arrays:數據或列表,多個值存儲到一個鍵
7、Object:用于嵌入式的文檔,即一個值為一個文檔
8、Null:存儲Null值
9、Timestamp:時間戳,表示從1970-1-1到現在的總秒數
10、Date:存儲當前日期或時間的UNIX時間格式
注:每個文檔都有一個屬性,為_id,保證每個文檔的唯一性,
可以自己去設置_id插入文檔,如果沒有提供,那么MongoDB為每個文檔提供了一個獨特的_id,類型為Object ID
Object ID是一個12字節的十六進制數:
前4個字節為當前時間戳
接下來3個字節為機器ID
接下來的2個字節為MongoDB的服務器進程id
最后3個字節為簡單的增量值
創建日期語句如下:參數的格式為YYYY-MM-DD,具體指令為:
new Date("2017-12-20")3、插入數據
插入文檔時,如果不指定_id參數,MongoDB會為文檔分配一個唯一的Objectid
1 db.collection_name.insert(document) 2 3 db.test.insert({name:"gi",gender:1})#向test集合插入數據{name:"gi",gender:1} 4 5 db.test.insert({_id:"20181125",name:"gi",gender:1})#向test集合插入數據{_id:"20181125"name:"gi",gender:1}?
1 ###Mong0DB插入數據 2 db.collection.insert({})#插入數據,“_id”存在就報錯 3 db.collection.save({})#插入數據,如果文檔的“_id”存在就會更新數據,如果文檔的“_id”不存在則添加數據4、刪除數據
db.集合名稱.remove(<query>,{justOne:<boolean>})
參數query:可選,刪除的文檔的條件
參數justOne:可選,如果設為True或1,則只刪除一條,默認false,表示刪除多條
1 ###MongDB刪除數據 2 db.test.remove({name:"xiaowang"},{justOne:true}) 3 #默認情況會刪除所有滿足條件的數據,{justOne:true}能達到只刪除一條的效果5、更新數據
指令:db.集合名稱。update(<query>,<update>,{multi:<boolean>})
參數query:查詢條件
參數update:更新操作符
參數multi:可選,默認是false,表示只更新找到的第一條記錄,值為True表示把所有滿足條件的文檔全部更新。
注意:“multi update only works with $ operators”(multi 只和$一起使用)
1 ###MongoDB更新數據 2 db.test.update({name:"xiaoming"},{name:"xiaozhang"}) 3 #把名字為xiaoming的數據替換為{name:"xiaozhang"},注意此時是整條數據被替換成{name:"xiaozhang"} 4 5 db.test.update({name:"xiaoming"},{$set:{name:"xiaozhang"}}) 6 #把name為xiaoming的數據name值更新為xiaozhang,注意此時只是這條數據的name被更新了,其他不變,且只更新數據集中的符合條件的第一條數據 7 8 db.test.update({name:"xiaoming"},{$set:{name:"xiaozhang"}},{multi:true}) 9 #{multi:true}可以達到更新多條數據的目的6、查詢數據
1、方法find():查詢
db.集合名稱.find({條件文檔})
2、方法findOne():查詢,只返回第一個
db.集合名稱.findOne({條件文檔})
3、方法pretty():將結果格式化
db.集合名稱.find({條件文檔}).pretty()
7、高級查詢
1、比較運算符
等于:默認是等于判斷,沒有運算符
小于:$it? ? (less than)
小于等于:$ite? ?(less than equal)
大于:$gt? ?(greater than)
大于等于:$gte? ? ?(greater than equal)
不等于:$ne
db.test.find({age:{$gte:18}}) #test中年齡大于等于18的記錄2.范圍運算符
使用“$in”,"$nin"判斷是否在某個范圍內
db.test.find({age:{$in:[18,28,38]}}) #查詢年齡為18,28,28的test中的記錄3、邏輯運算符
and:在json中寫多個條件即可
db.test.find({age:{$gte:18},gender:true}) #查詢年齡大于或等于18,并且性別為true的學生or:使用$or,值為數組,數組中每個元素為json
db.test.find({$or:[{age:{$gt:18}},{gender:false}]}) #查詢年齡大于18,或性別為false的學生 db.test.find({$or:[{age:{$gte:18}},{gender:true}],name:"gi"}) #查詢年齡大于18或性別為男生,并且姓名為“gi”4、正則表達式
使用//或$regex編寫正則表達式
db.test.find({sku:/^abc/}) #sku標簽中以abc開頭的記錄db.test.find({sku:{$regex:"789$"}}) #sku標簽中以789$結尾的記錄5、limit和skip
方法limit():用于讀取指定數量的文檔
db.集合名稱.find().limit(NUMBER)
db.test.find().limit(2) #查詢test集合中的前兩條記錄方法skip():用于跳過指定數量的文檔
db.集合名稱.find().skip(NUMBER)
db.test.find().skip(2) #跳過test集合中的前兩條數據,同時使用skip和limit(可實現翻頁功能)(一般先使用skip,再使用limit,這樣效率高)
db.test.find().skip(2).limit(2)db.test.find().limit(3).skip(2)6、自定義查詢
使用$where后面寫一個函數,返回滿足條件的數據
#查詢年齡大于30 的學生 db.test.find({$where:function(){return this.age>30;}})7、投影
在查詢到的返回結果中,只選擇必要的字段
db.集合名稱。find({},{字段名稱:1,...})
參數為字段與值,值為1表示顯示,值為0表示不顯示
特殊:對于_id列默認是顯示的,如果不顯示需要明確設置為0
#test輸出只顯示name列和gender列 db.test.find({},{_id:0,name:1,gender:1})8、排序
方法sort(),用于對集合進行排序
db.集合名稱.find().sort({字段:1,...})
參數1為升序排列
參數-1為降序排列
#根據性別降序,在根據年齡升序 db.test.find().sort({gender:-1,age:1})9、統計個數
方法count()用于統計結果集中文檔條數
db.集合名稱.find({條件}).count()
db.集合名稱.count({條件})
db.test.find({gender:true}).count()db.test.count({age:{$gt:20},gender:true})10、消除重復
方法distinct()對數據進行去重
db.集合名稱.distinct("去重字段":{條件})
db.test.distinct("hometown",{age:{$gt:18}})?8、聚合
聚合(aggregate)是基于數據處理的聚合管道,每個文檔通過一個由多個階段(stage)組成的管道,可以對每個階段的管道進行分組、過濾、等功能,然后經過一系列的處理,輸出相應的結果。
db.集合名稱。aggregate({管道:{表達式}})
常用管道:
在MongoDB中,文檔處理完畢后,通過管道進行下一次處理,常用管道如下:
$group:將集合中的文檔分組,可以用于統計結果
$match:過濾數據,只輸出符合條件的文檔
$project:修改輸入文檔的結構,如重命名、增加、刪除字段、創建計算結果
$sort:將輸出文檔排序后輸出
$limit:限制聚合管道返回的文檔書數
$skip:跳過指定數量的文檔,并返回余下的文檔
$unwind:將數組類型的字段進行拆分
表達式
處理輸入文檔并輸出
語法:表達式:“$列名”
常用表達式
$ sum:計算總和,$sum:1表示以一倍計數
$avg:計算平均值
$min:獲取最小值
$max:獲取最大值
$push:在結果文檔中插入值到一個數組中
$first:根據資源文檔的排序獲取第一個文檔數據
$last:根據資源文檔的排序獲取最后一個文檔數據
?
$group對應的字典中有幾個鍵,結果中就有幾個鍵
分組依據需要放在_id后面
取不同的字段的值需要使用$,"$age"、“$gender”
取字典嵌套的字典中的值的時候“$_id.country”
能夠同時按照多個建進行分組“{$group:{_id:{country:$country,province:"$province"}}}”
結果是:{_id:{country:"",province:""}}
#統計男生、女生總人數 db.test.aggregate({¥group:{_id:"$gender",counter:{$sum:1}}}) #Group by null #將所有文檔分為一組 #求學生總人數、平均年齡 db.test.aggregate({$group:{_id:null,counter:{$sum:1},avgAge:{$avg:"$age"}}})$project:修改輸入文檔的結構,如重命名、增加、刪除字段、創建計算結果
#查詢學生的姓名和年齡 db.stu.aggregate({$project:{_id:0,name:1,age:1}}) #查詢男生、女生人數,輸出人數 db.stu.aggregate({$group:{_id:"$gender",counter:{$sum:1}}},{$project:{_id:0,counter:1}}) db.stu.aggregate({$group:{_id:"$gender",count:{$sum:1},aug_age:{$avg:$age}}},{$project:{gender:"$_id",count:"$count",avg_age:"$avg_age"}})$match:過濾數據,只輸出符合條件的文檔
#查詢年齡大于20 的學生 db.test.aggregate({$match:{age:{$gt:20}}}) #查詢年齡大于20 的男生、女生人數 db.test.aggregate({$match:{age:{$gt:20}}},{$group:{_id:"$gender",counter:{$sum:1}}})?$sort:將輸出文檔排序后輸出
#查詢學生信息,按年齡升序 db.stu.aggregate({$sort:{age:1}}) #查詢男生和女生人數,按人數的降序排序 db.stu.aggregate({$group:{_id:"gender",count:{$sum:1}}},{$sort:{count:-1}})$limit:限制聚合管道返回的文檔書數
#顯示前兩條記錄 db.test.aggregate({$limit:2})$skip:跳過指定數量的文檔,并返回余下的文檔(一般先使用skip,再使用limit)
#跳過指定2條數量記錄 db.test.aggregate({$skip:2})$unwind:將數組類型的字段進行拆分
db.集合名稱.aggregate({$unwind:"$字段名稱"})
db.test.insert({_id:1,item:"t-shirt",size:["S","M","L"]}) db.test.aggregate({$unwind:"$size"})結果如下:
{“_id”:1,"item":"t-shirt","size":"S"}
{“_id”:1,"item":"t-shirt","size":"M"}
{“_id”:1,"item":"t-shirt","size":"L"}
屬性perserveNullAndEmptyArrays,值為false表示丟棄屬性值為空的文檔
屬性perserveNullAndEmptyArrays,值為true表示保留屬性值為空的文檔
用法:db.test.aggregate({$unwind:{path:"$size",perserveNullAndEmptyArrays:true}})
#perserveNullAndEmptyArrays:true #防止數據丟失
轉載于:https://www.cnblogs.com/zhiliang9408/p/10013958.html
總結
以上是生活随笔為你收集整理的mongodb基本指令与高级查询指令以及聚合命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库表字段命名规则
- 下一篇: 第七周学习笔记