首先建立一個數據庫:這裏和通常的關係型數據庫同樣,都要創建一個屬於本身的數據庫空間.python
注意 : MongoDB中若是你使用了不存在的對象,那麼就等於你在建立這個對象哦數據庫
use my # 建立數據庫,若是有 my 這個數據庫就是使用 db # 顯示當前使用的數據庫
注意 : 建立完數據庫後,若是查看是看不到的,由於若是不向數據庫中添加數據,數據庫存在在內存中,添加數據後,永久存在在磁盤中數組
建立一張表 : s1app
db.s1 # 建立表 s1 db.s1.drop() # 刪除表 db.dropDatabase() # 刪除庫
集合(表)的增刪改查 ide
添加 post
插入數據有三種方法 : insert , insertOne , insertMany . 學習
官方推薦使用 insertOne , insertMany . spa
1 . insert : 插入一條或者多條數據.(官方不推薦)3d
注意 : 插入多條數據的時候是 ([] {},{},{} ]),一個{} 表明一條數據 ,要放在列表中.unix
2 . insertOne : 插入一條數據
3 . insertMany : 插入多條數據
這就是咱們向s1中插入的多條數據
[{ "name":"tom1", "age":18 }, { "name":"meng", "age":20 }]
查詢
1 . find() : 無條件查詢,將表中數據一次性返回多條數據
find({}) : 條件查詢,會返回多條數據.
2 . findOne() : 無條件查詢.默認返回表中的第一條數據
findOne({}) : 條件查詢.默認返回一條,若是有多條則返回靠前的數據.
修改
1 . update : 跟距條件修改,官方不推薦
# 語法 : db.s1.update({"":""},{$set:{"":""}}) update({"name":"DragonFire"},{$set:{"age":21}}): # 把name等於DragonFire中的age改成21 # 這裏要注意的是({"條件"},{"關鍵字":{"修改內容"}}),其中若是條件爲空,那麼將會修改Collection中全部的數據
2 . updateOne : 根據條件修改一條數據,若是出現多條則修改最前的一條
根據 age=18爲條件,修改name=kebi,出現了2條,結果只是修改了靠前的一條
3 . updateMany : 根據條件修改全部符合條件的內容.多條修改
注意 : $set 是update的關鍵字,表示我要設置 xx屬性的值爲 xxx,可是因爲MongoDB的靈活性,沒有我就建立,因此說,若是這條Documents沒有 xx 屬性,他就會自動建立一個 xx 屬性而且賦值爲 "xxx" .
刪除
1 . remone({}) : 無條件刪除數據,刪除全部數據,清空.
2 . remove({"name":"meng"}) : 刪除條件 name=meng 的全部數據
$關鍵字及修改器
$關鍵字
1 . 等於 : " : "
2 . 大於 : "$gt"
3 . 小於 : "$lt"
4 . 大於等於 : "$gte"
5 . 小於等於 : "$lte"
6 . 並列條件
find({"name":"1","age":2}) # 或條件 - 不一樣字段的或 $or findOne({$or:[{"name":"1"},{"age":2}]}) # 子集 位置能夠發生變化 $in findOne({"age":{$in:[1,2,3,4,5]}}) # 徹底符合 位置能夠發生變化 $all findOne({"age":{$all:[1,2,3,4]}})
修改器
顧名思義,修改器對應的就是 update,在以前咱們使用update的時候就用過$set,在update中還有不少的 $關鍵字,咱們把update中的 $關鍵字 稱爲 修改器.
1 . $inc :
至關於python中 變量 +/-= 1. 將查詢結果加上/減去某個值,而後保存.
2 . $set : 強制修改,沒有就自動增長一條
3 . $unset : 用來刪除key(field)的
4 . $push :
它是用來對Array (list)數據類型進行 增長 新元素的,至關於咱們大Python中 list.append() 方法,
5 . $pull :
有了$push 對Array類型進行增長,就必定有辦法對其內部進行刪減,$pull 就是指定刪除Array中的某一個元素
得出了一個結論,只要知足條件,就會將Array中全部知足條件的數據所有清除掉
6 . $pop : 指定刪除Array中的第一個 或者 最後一個元素
作個小例子: 刪除"score" 等於 100 分 test_list 的最後一個元素
怎麼刪除第一個呢?
{$pop:{"test_list" : -1}} -1 表明最前面, 1 表明最後邊 (這和咱們大Python正好相反) 記住哦
$ 代指符
在MongoDB中有一個很是神奇的符號 "$"
"$" 在 update 中 加上關鍵字 就 變成了 修改器
其實 "$" 字符 獨立出現也是有意義的 , 我起名叫作代指符
首先看個例子: 仍是這個Collection
如今把 "score": 100 的 test_list 裏面的 2 改成 9
{$set :{"test_list.0" : 9}} 這樣就是對應 Array 中的下標進行修改了 "test_list.下標"
問題來了 若是 是 一個很長很長很長的 Array 你要查找其中一個值,把這個值修改一下怎麼整呢?
神奇不神奇?
$ 字符 在語句中表明瞭什麼呢? 下標,位置
解釋一下: 首先咱們查詢一下db.Oldboy.findOne({"score":100,"test_list":3}) 返回 給咱們知足條件的數據對吧
那麼 若是 咱們 使用 update的話, 知足條件的數據下標位置就會傳遞到 $ 字符中,在咱們更新操做的時候就至關於 對這個位置 的元素進行操做
咱們已經學過MongoDB的 find() 查詢功能了,在關係型數據庫中的選取(limit),排序(sort) MongoDB中一樣有,並且使用起來更是簡單
首先咱們看下添加幾條Document進來
如今有四條Document 根據它們, 對 Limit Skip Sort 分別展開學習 最後來一個 大雜燴
1. Limit 選取 : 我要從這些 Document 中取出多少個
作個小例子 : 我只要 2 條 Document
結果是很明顯的
可是我仍是要解釋一下 : limit(2) 就是選取兩條Document, 從整個Collection的第一條 Document 開始選取兩條
2.Skip 跳過 : 我要跳過多少個Document
作個小例子 : 我要跳過前兩個 Document 直接從第三個Document 開始
解釋一下 : skip(2) 就是跳過兩條Document, 從整個Collection 的第一條 Document 開始跳,日後跳兩條
另外一個例子 : 跳過第一條 直接從 第二條 開始
3.Limit + Skip : 從這兒到那兒 的 選取
就是剛纔的問題,一個小例子 : 我只想要第二條和第三條怎麼處理呢
跳過第一條Document 從第二條開始選取兩條 Document
彆着急,還有另外一種寫法
兩種寫法徹底獲得的結果徹底同樣可是國際慣例的解釋卻不一樣
選取兩條Document 可是要 跳過 第一條Document 從 第二條 開始 選取
4. Sort 排序 : 將結果按照關鍵字排序
作個小例子 : 將find出來的Document 按照 price 進行 升序 | 降序 排列
按照 price 字段進行升序 , 1 爲升序 , -1 爲降序
5. Limit + Skip + Sort 混搭來一把
一個例子 : 選取第二條第三條 並 按照 price 進行 升序排列
問題出現了, 按道理不該該是 9800 而後 19800 嗎?
知識點來嘍
重點 : Sort + Skip + Limit 是有執行優先級的 他們的界別分別是 優先 Sort 其次 Skip 最後 Limt
Skip + Limit 的優先級 也是先 Skip 再 Limit
sort > skip > limit
首先咱們要先了解一下MongoDB中有什麼樣的數據類型:
Object ID :Documents 自生成的 _id
String: 字符串,必須是utf-8
Boolean:布爾值,true 或者false (這裏有坑哦~在咱們大Python中 True False 首字母大寫)
Integer:整數 (Int32 Int64 大家就知道有個Int就好了,通常咱們用Int32)
Double:浮點數 (沒有float類型,全部小數都是Double)
Arrays:數組或者列表,多個值存儲到一個鍵 (list哦,大Python中的List哦)
Object:若是你學過Python的話,那麼這個概念特別好理解,就是Python中的字典,這個數據類型就是字典
Null:空數據類型 , 一個特殊的概念,None Null
Timestamp:時間戳
Date:存儲當前日期或時間unix時間格式 (咱們通常不用這個Date類型,時間戳能夠秒殺一切時間類型)
1 . Object ID :
"_id" : ObjectId("5b151f8536409809ab2e6b26") #"5b151f85" 代指的是時間戳,這條數據的產生時間 #"364098" 代指某臺機器的機器碼,存儲這條數據時的機器編號 #"09ab" 代指進程ID,多進程存儲數據的時候,很是有用的 #"2e6b26" 代指計數器,這裏要注意的是,計數器的數字可能會出現重複,不是惟一的 #以上四種標識符拼湊成世界上惟一的ObjectID #只要是支持MongoDB的語言,都會有一個或多個方法,對ObjectID進行轉換 #能夠獲得以上四種信息 #注意:這個類型是不能夠被JSON序列化的
這是MongoDB生成的相似關係型DB表主鍵的惟一key,具體由24個字節組成:
0-8字節是時間戳,
9-14字節的機器標識符,表示MongoDB實例所在機器的不一樣;
15-18字節的進程id,表示相同機器的不一樣MongoDB進程。
19-24字節是計數器
2.String :
UTF-8字符串,記住是UTF-8字符串
3.Boolean :
true or false 這裏首字母是小寫的
4.Integer :
整數 (Int32 Int64 大家就知道有個Int就好了,通常咱們用Int32)
5.Double :
浮點數 (MongoDB中沒有float類型,全部小數都是Double)
6.Arrays :
{ "_id" : ObjectId("5b163830993ddc4cd4918ead"), "name" : "LuffyCity", "teacher" : [ "DragonFire", "WuSir2B", "Alex AGod" ] }
7 . Object : 至關於python中的 字典
{ "_id" : ObjectId("5b163915993ddc4cd4918eaf"), "name" : "LuffyCity", "course" : { "name" : "Python", "price" : 19800 } }
8 . Null
{ "_id" : ObjectId("5b163a0e993ddc4cd4918eb0"), "name" : "LuffyCity", "course" : null }
空數據類型 , 一個特殊的概念,None Null
9 . Timestamp : 時間戳
{ "_id" : ObjectId("5b163bbf993ddc4cd4918eb3"), "name" : "LuffyCity", "date" : 1528183743111 }
10 . Date :
{ "_id" : ObjectId("5b163ba1993ddc4cd4918eb2"), "name" : "LuffyCity", "date" : ISODate("2018-06-05T15:28:33.705+08:00") }
存儲當前日期或時間格式 (咱們通常不多使用這個Date類型,由於時間戳能夠秒殺一切時間類型)
練習題
1. 查詢崗位名以及各崗位內的員工姓名 2. 查詢崗位名以及各崗位內包含的員工個數 3. 查詢公司內男員工和女員工的個數 4. 查詢崗位名以及各崗位的平均薪資、最高薪資、最低薪資 5. 查詢男員工與男員工的平均薪資,女員工與女員工的平均薪資 6. 查詢各崗位內包含的員工個數小於2的崗位名、崗位內包含員工名字、個數 7. 查詢各崗位平均薪資大於10000的崗位名、平均工資 8. 查詢各崗位平均薪資大於10000且小於20000的崗位名、平均工資 9. 查詢全部員工信息,先按照age升序排序,若是age相同則按照hire_date降序排序 10. 查詢各崗位平均薪資大於10000的崗位名、平均工資,結果按平均薪資升序排列 11. 查詢各崗位平均薪資大於10000的崗位名、平均工資,結果按平均薪資降序排列,取前1個
1. 查詢崗位名以及各崗位內的員工姓名 db.emp.aggregate({"$group":{"_id":"$post","names":{"$push":"$name"}}}) 2. 查詢崗位名以及各崗位內包含的員工個數 db.emp.aggregate({"$group":{"_id":"$post","count":{"$sum":1}}}) 3. 查詢公司內男員工和女員工的個數 db.emp.aggregate({"$group":{"_id":"$sex","count":{"$sum":1}}}) 4. 查詢崗位名以及各崗位的平均薪資、最高薪資、最低薪資 db.emp.aggregate({"$group":{"_id":"$post","avg_salary":{"$avg":"$salary"},"max_salary":{"$max":"$salary"},"min_salary":{"$min":"$salary"}}}) 5. 查詢男員工與男員工的平均薪資,女員工與女員工的平均薪資 db.emp.aggregate({"$group":{"_id":"$sex","avg_salary":{"$avg":"$salary"}}}) 6. 查詢各崗位內包含的員工個數小於2的崗位名、崗位內包含員工名字、個數 db.emp.aggregate( { "$group":{"_id":"$post","count":{"$sum":1},"names":{"$push":"$name"}} }, {"$match":{"count":{"$lt":2}}}, {"$project":{"_id":0,"names":1,"count":1}} ) 7. 查詢各崗位平均薪資大於10000的崗位名、平均工資 db.emp.aggregate( { "$group":{"_id":"$post","avg_salary":{"$avg":"$salary"}} }, {"$match":{"avg_salary":{"$gt":10000}}}, {"$project":{"_id":1,"avg_salary":1}} ) 8. 查詢各崗位平均薪資大於10000且小於20000的崗位名、平均工資 db.emp.aggregate( { "$group":{"_id":"$post","avg_salary":{"$avg":"$salary"}} }, {"$match":{"avg_salary":{"$gt":10000,"$lt":20000}}}, {"$project":{"_id":1,"avg_salary":1}} ) 9. 查詢全部員工信息,先按照age升序排序,若是age相同則按照hire_date降序排序 db.emp.aggregate( {"$sort":{"age":1,"hire_date":-1}} ) 10. 查詢各崗位平均薪資大於10000的崗位名、平均工資,結果按平均薪資升序排列 db.emp.aggregate( { "$group":{"_id":"$post","avg_salary":{"$avg":"$salary"}} }, {"$match":{"avg_salary":{"$gt":10000}}}, {"$sort":{"avg_salary":1}} ) 11. 查詢各崗位平均薪資大於10000的崗位名、平均工資,結果按平均薪資降序排列,取前1個 db.emp.aggregate( { "$group":{"_id":"$post","avg_salary":{"$avg":"$salary"}} }, {"$match":{"avg_salary":{"$gt":10000}}}, {"$sort":{"avg_salary":-1}}, {"$limit":1}, {"$project":{"date":new Date,"平均工資":"$avg_salary","_id":0}} ) 參考答案