增刪改查,$關鍵字,數據類型

         增刪改查        

  首先建立一個數據庫:這裏和通常的關係型數據庫同樣,都要創建一個屬於本身的數據庫空間.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的話, 知足條件的數據下標位置就會傳遞到 $ 字符中,在咱們更新操做的時候就至關於 對這個位置 的元素進行操做

 

         limit , skip , sort           

咱們已經學過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}}
)

參考答案
答案
相關文章
相關標籤/搜索