MongoDB系列---集合與文檔操做03

MongoDB-——Collection


 

學習大綱:

  一、集合操做

  二、文檔操做  


 

 

知識回顧:

  上一篇咱們講述瞭如何對MongoDB的權限和用戶進行平常的基本操做,來達到咱們對數據庫的基本安全保障。java

 


 

 

一 MongoDB的集合操做


 

 

前言:

  MongoDB中的集合是一組文檔的集,至關於關係型數據庫中的表。linux

1 建立集合

  MongoDB使用db.createCollection()函數來建立集合。spring

語法格式:db.createCollection(name,options)
name:要建立的集合名稱
options:可選參數,指定有關內存大小及索引的選項

options 能夠是以下參數

 

 

   在插入文檔時,MongoDB首先檢查固定集合的size字段,而後檢查max字段

 

1.1 使用默認集合

  在MongoDB中,咱們能夠不用建立集合,當咱們插入一些數據時,會自動建立集合,而且會使用文檔管理命令中的集合名稱做爲集合的名稱。文檔管理命令後續會詳細講解。

  建立一個新數據庫,名爲day(名稱本身隨意)sql

 

 

若是開啓認證,須要爲數據庫建立訪問用戶。mongodb

新建 用戶名爲day,密碼也爲day  權限爲writeDay  數據庫爲day(這裏邊用到了前邊的知識,用戶管理等。須要注意的是,建立用戶咱們須要使用具備userAdminAnyDatabase權限的用戶,也就是咱們前一博文建立的test,或者本身有相應權限的帳戶均可以。)

 

 

咱們使用這個day用戶登陸day數據庫(最好把客戶端關閉,在從新啓動登陸,不然可能會出現問題!),並向庫中插入一條測試數據庫

 

 

查詢集合

 這時候咱們發現,多出了一個集合,名字就爲咱們的數據庫名,由於上面說過,咱們沒有手動建立集合的時候,並直接插入,它會使用默認的數據庫的名字做爲集合的名字生成一個集合,這時候剛剛插入的數據就在這個集合裏面。shell

 

 


 

1.2 建立不帶參數的集合

  咱們也能夠根據本身的狀況建立集合。在 day數據庫中建立一個名爲 day1 的集合,該集合建立時不指定任何參數。若是開啓認證,則須要使用具備數據庫管理員權限的用戶來建立集合。數據庫

 

 

1.3 建立帶參數的集合

在 develop 數據庫中建立一個名爲 day2的固定集合,整個集合空間大小爲 2000000kb(大約1.9g),文檔最大個數爲 1000數組

db.createCollection('day2',{capped:true,autoIndexId:true,size:2000000,max:1000})

 

 

 

 

 

 

2 查看集合

  若是要查看已有集合,可使用 show collections 或 show tables 命令。安全

2.1 show collections

 

2.2 show tables

 

 

 

 


 

 

二 文檔操做


 

 

前言:

  在MongoDb中文檔是指多個鍵及其關聯的值有序地放置在一塊兒就是文檔,其實指的就是數據,也就是咱們平時操做最多的部分。數據結構

  MongoDB 中的文檔的數據結構和 JSON 基本同樣。全部存儲在集合中的數據都BSON 格式。

  BSON 是一種相似 JSON 的二進制形式的存儲格式,是 Binary JSON 的簡稱

 

1 插入文檔

1.1 插入單個文檔

1.1.1 insert函數

語法格式:db.COLLECTION_NAME.insert(document)。

 

使用咱們的day用戶來向day數據庫裏面的day集合添加一條數據並查看

db.day.insert({title:'day',tags:['java','BigData']})

db.day.find()

 

 

 

1.1.2 save函數

 使用咱們的day用戶來向day數據庫裏面的day集合添加一條數據並查看

db.day.save({title:'day1',tags:['java1','BigData1']})

db.day.find()

 

 

1.1.3 insertOne函數

 在 MongoDB3.2 之後的版本中,提供了 insertOne()函數用於插入文檔。向 day集合中插入單個文檔。

 使用咱們的day用戶來向day數據庫裏面的day集合添加一條數據並查看

db.day.insertOne({title:'day2',tags:['java2','BigData2']})

db.day.find()

    

 

 


 

 

1.2 插入多個文檔

向集合中批量插入多個文檔時候,須要使用數組來存放文檔

語法格式:db.COLLECTION_NAME.insert([{},{},{}.....])

 

1.2.1 insert或save函數實現多文檔插入

向day集合中批量插入多個文檔

db.day.insert([{title:'arebirth',tags:['a','b','c']},{title:'arebirth1',tags:['spring','mvc','collection']}])

 

 

 查看文檔

 

 

這裏邊的save就不演示了,跟inser操做語法同樣,只是換一個函數名字而已。

 

 1.2.2 insertMany 函數

在 MongoDB3.2 之後的版本中,提供了 insertMany 函數用於插入文檔

語法格式:db.COLLECTION_NAME.insertMany([{},{},{},.....])

 

向day集合中批量插入多個文檔

db.day.insertMany([{title:'arebirth-many',tags:['a-many','b-many','c-many']},{title:'arebirth1-many',tags:['spring-many','mvc-many','collection-many']}])

 

 

 查看文檔

 

 

 


 

 

1.3 經過變量插入文檔

  Mongo Shell(也就是咱們如今操做MongoDB用的工具)工具容許咱們定義變量。全部的變量類型爲var類型。也能夠忽略變量類型。變量中的賦值符號後側須要使用小括號來標識變量中的值。咱們能夠將變量做爲任意插入文檔的函數的參數。

語法格式:變量名=({變量值})

 

1.3.1 經過變量插入單個文檔

定義變量
document=({title:'SpringCloud',tags:['Spring Cloud Netflix','Spring Cloud Security','Spring Cloud Consul']})

 

 

插入文檔

咱們如今將多個文檔放入到了一個變量中,因此在插入數據時,可直接使用插入單個文 檔的函數

 

 查詢文檔

 

1.3.2 經過變量插入多個文檔

插入多個文檔跟單個文檔是同樣的,區別只是咱們上邊學習了若是要插入多個文檔須要在文檔外圍加上中括號,數組包裹起來。

語法結構:變量名=([{},{},{},....])

這裏就不演示了,動手本身測試下。

 

使用完變量插入咱們應該注意的是:

  變量的有效期範圍,它只是在當前的會話內有效,若是咱們超出了這個會話,就失效了。

  那麼會話指的是什麼?就是咱們在linux上打開的mongo shell客戶端,如今操做命令的客戶端,你只要把這個客戶端關閉,再從新啓動,再使用上一次聲明的變量,將會發現,已經無效了。

 

 

2 更新文檔

  MongoDb經過update函數與save函數來更新集合中的文檔

2.1 update函數

update()函數用於更新已存在的文檔。

語法格式:
db.集合名稱.update(
    <query>,
    <update>,
    < upsert:boolean>,
    < multi:boolean>
)

參數說明:

query:update的查詢條件,相似sql update更新語法內where後面的內容

update:update的對象和一些更新的操做符等,也能夠理解爲sql update查詢內set後面的

upsert:可選,這個參數的意思是,若是不存在update的記錄,是否插入這個document,true爲插入。默認爲false,不插入

multi:可選,mongodb默認是false,只更新找到的第一條記錄,若是這個參數爲true,就把這個按條件查出來多條記錄所有更新。

 

在 MongoDB 中的 update 是有兩種更新方式,一種是覆蓋更新,一種是表達式更新。

覆蓋更新:顧名思義,就是經過某條件,將新文檔覆蓋原有文檔。表達式更新:這種更新方式是經過表達式來實現複雜更新操做,如:字段更新、數值計算、數組操做、字段名修改等。

 

2.1.1 覆蓋更新

  覆蓋更新不能將multi參數設置爲true,由於若是multi參數爲true的話,只能使用表達式更新操做。

 

咱們首先插入一條數據

db.day.insert({id:1,title:'覆蓋更新',content:'學習覆蓋更新'})

 

 

經過update方法來更新

db.day.update({id:1},{title:'更新後的內容'})

 

來查看下,更新後的內容

 

 咱們能夠明顯發現,字段少了兩個,內容也變了,對,這就是覆蓋更新。正如它的名字同樣,「覆蓋」。因此咱們要使用這個更新必定要注意,要給全全部更新項,不然就是這種情況了。

 


 

 

2.1.2 表達式更新

語法:
db.集合名稱.update(
    <query>,
    <doc_projection>
);
doc_projection 語法:
{
    $表達式:{具體更新規則}
}

 

2.1.2.1 $inc

用法:{$inc:{field:value}}

做用:對一個數字字段的某個field增長value

示例:將name爲arebirth的學生的age增長5

測試數據
db.day.insert({name:'arebirth',age:17})

命令:

db.day.update({name:'arebirth'},{$inc:{age:5}})

結果:

 

 

 

2.1.2.2 $set

用法:{$set:{field:value}}

做用:把文檔中某個字段field的值設爲value,若是field不存在,則增長新字段並將值賦值爲value

示例:把arebirth的年兩設爲18歲(上方的數據)

命令:

db.day.update({name:'arebirth'},{$set:{age:18}})

結果:

 

 

能夠自行操做下沒有的字段,看看對應的文檔是否插入了新的字段

 

2.1.2.3 $unset

用法:{$unset:{field:1}}

做用:刪除某個字段field   1用於佔位,填寫什麼數字均可以,爲了知足bson格式

示例:將arebirth的年齡的字段刪除

命令:

db.day.update({name:'arebirth'},{$unset:{age:1}})

結果:

 

 能夠發現,age字段已經不存在了。

 

2.1.2.4 $push

用法:{$push:{field:value}}

做用:把value追加到filed裏面。注意:field只能是數組類型,若是field不存在,會自動插入一個數組類型

示例:給arebirth 添加別名"boy"

命令:

db.day.update({name:'arebirth'},{$push:{alias:'boy'}})

結果:

 

 

2.1.2.5 $addToSet

用法:{$addToSet:{field:value}}

做用:加一個值到數組內,並且只有當這個值不存在的時候數組纔會添加進去

示例:往boy的別名字段裏添加3個別名,boy、boy二、boy3

命令:

db.day.update({name:'arebirth'},{$addToSet:{alias:'boy'}})

結果:

 

 咱們會發現,和原來的值沒有區別,這是由於裏邊已經有相同的值了,因此再也不添加。

 

2.1.2.6 $pop

用法:刪除數組內第一個值:{$pop:{field:-1}}、刪除數組內最後一個值:{$pop:{field:1}}

做用:用於刪除數組內一個值

示例:刪除上邊操做的數據中的name爲arebirth中alias字段中最後一個別名(繞嘴)

首先添加幾個數據
db.day.update({name:'arebirth'},{$push:{alias:'boy1'}})
db.day.update({name:'arebirth'},{$push:{alias:'boy2'}})
db.day.update({name:'arebirth'},{$push:{alias:'boy3'}})
 
  
 
 

 

 

命令:

db.day.update({name:'arebirth'},{$pop:{alias:1}})

 

 咱們能夠看到boy3沒了。

 

2.1.2.7 $pull

用法:{$pull:{field:value}}

做用:從數組field內刪除一個等於value的值

示例:刪除arebirth記錄中的別名boy2

命令:

db.day.update({name:'arebirth'},{$pull:{alias:'boy2'}})

結果:

 

 

2.1.2.8 $pullAll

用法:{$pullAll:value_array}

做用:用法同$pull同樣,不一樣的是能夠一次性刪除數組內的多個值

示例:刪除arebirth記錄內的boy1和boy別名

命令:

db.day.update({name:'arebirth'},{$pullAll:{alias:['boy1','boy']}})

結果:

 

 咱們能夠看見,兩個記錄都已經刪除了。

 

2.1.2.9 $rename

用法:{$rename:{od_field_name:new_field_name}}

做用:對字段進行重命名。底層實現是先刪除old_field字段,再建立new_field字段

示例:把arebirth記錄的name字段更名爲newName

命令:

db.day.update({name:'arebirth'},{$rename:{name:'newName'}})

結果:

 咱們能夠發現名字改變了,位置也改變了,就是由於底層實現是先刪除再重建。

 


 

 

2.2 save函數

  save()函數的做用是保存文檔,若是文檔存在則覆蓋,若是文檔不存在則新增。save函數對文檔是否存在的惟一判斷標準是"_id"系統提供的惟一字段是否匹配。因此使用save()函數實現更新操做,則必須提供「_id"字段數據。

db.集合名稱.save(
<document>
);

參數document表明要修改的文檔內容,要求必須體哦那個"_id"字段數據

 

使用save()函數來實現更新操做:

db.day.save({_id:ObjectId("5dbffb7b408346b43a0df419"),newName:'rebirth'})

這個上邊命令的_id根據本身客戶端上經過find()函數查找出來的爲準,

結果:

以前的:

 

 

 執行命令以後的:

 

 

 

3 刪除文檔

  MongoDB是經過remove()函數、deleteOne()函數、deleteMany()函數來刪除集合中的文檔

3.1 remove 函數

語法格式是:
db.集合名稱.remove(
    <query>,
    <justOne:boolean>
);

參數說明:

query:要刪除的文檔條件,至關於sql語句中的where子句做用

justOne:可選參數,布爾類型,表明是否只刪除第一個匹配條件知足的文檔。默認爲false,表明刪除所有知足匹配條件的文檔:

注意:

  此方法已通過時,官方推薦使用deleteOne和deleteMany函數來實現刪除操做。且remove()函數並不會真正的釋放掉存儲空間,須要刪除後,再用管理員權限的帳戶執行db.repairDatabase()函數來釋放存儲空間!

 

3.1.1 remove 刪除所有

刪除day集合中的所有文檔(破壞力強,慎用!)

db.day.remove({})

 

3.1.2 remove 條件刪除

刪除day集合中age字段爲10的文檔

db.day.remove({age:10})

 

3.2 deleteOne 函數

語法格式:
db.集合名稱.deleteOne({<query>});

參數解釋:

query:要刪除的問單獨給條件,至關於sql語句中的where子句做用

 

刪除day集合中name字段爲arebirth的第一個文檔(由於它只刪除知足條件的第一個文檔,即便有多條,也就會刪除第一個知足的文檔)

db.day.deleteOne({name:'arebirth'})

 

3.3 deleteMany 函數

語法格式:
db.集合名稱.deleteMany({<query>});
參數解釋:

query:要刪除的文檔條件,至關於sql語法中的where子句做用

 

刪除day集合中字段大於10的全部文檔(這裏邊用到了單條件運算符"$gt" ,咱們後邊會詳細講解)

db.day.deleteMany({age:{$gt:10}})

 

 

4 查詢文檔

  MongoDB是經過findOne()和find()函數來實現文檔查詢的

4.1 findOne、find函數基礎應用

4.1.1 findOne 函數

findOne 函數用於查詢集合中的一個文檔。語法以下:

db.集合名稱.findOne({
    <query>},
    {<projection>
});

參數解釋:

query:可選,表明查詢條件

projection:可選,表明查詢結果的投影字段名。即查詢結果須要返回哪些字段或不須要返回哪些字段。

 

首先咱們用上方刪除命令清空咱們的day數據庫,而後來插入幾條數據

清空
db.day.remove({})

測試數據
db.day.insert({name:'arebirth',num:1})
db.day.insert({name:'arebirth',num:2})
db.day.insert({name:'arebirth',num:3})
db.day.insert({name:'arebirth',num:4})

 

查詢day集合中第一個文檔:

db.day.findOne()
or
db.day.findOne({})

 

 

查詢day集合中ame字段爲arebirth的第一個文檔

db.day.findOne({name:'arebirth'})

 

 

查詢day集合中第一個文檔,且只顯示num字段

db.day.findOne({},{num:1})

 

 

查詢day集合中第一個文檔,且不顯示name和num字段

db.day.findOne({},{name:0,num:0})

 

 

 

0 不顯示  1 顯示

注意:

  在 projection 中不能使用{'name':0, 'age':1}這種語法格式,這是錯誤的語法。projection 只能定義要返回的字段或不返回的字段。_id 字段是 MongoDB 維護的字段,是惟一能夠在 projection 中獨立使用的。如:{_id:0, 'name':1, 'age':1}

 

 

 

 

 

 

 

 

 

相關文章
相關標籤/搜索