最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MongoDB的創(chuàng)建、更新和刪除

 更新時(shí)間:2017年05月01日 01:00:57   投稿:mdxy-dxy  
下面開始學(xué)習(xí)MongoDB最重要也是最基礎(chǔ)的部分:C(創(chuàng)建)R(查詢)U(更新)D(刪除);由于R(查詢)操作相對來說內(nèi)容比較多,也比較繁瑣,同時(shí)使用頻率也比較高,所以下一篇會(huì)拿出來單獨(dú)介紹。廢話不多說,連上服務(wù)器,我們直接進(jìn)入正題

概要

  下面開始學(xué)習(xí)MongoDB最重要也是最基礎(chǔ)的部分:C(創(chuàng)建)R(查詢)U(更新)D(刪除);由于R(查詢)操作相對來說內(nèi)容比較多,也比較繁瑣,

  同時(shí)使用頻率也比較高,所以下一篇會(huì)拿出來單獨(dú)介紹。廢話不多說,連上服務(wù)器,我們直接進(jìn)入正題!

一、創(chuàng)建

  按照我們關(guān)系型數(shù)據(jù)庫的思想,一個(gè)服務(wù)器要想存放數(shù)據(jù),首先要有數(shù)據(jù)庫,表,字段,約束,當(dāng)然了也少不了主鍵,外鍵,索引,關(guān)系等;

  但是在MongoDB的世界里邊,我們不用預(yù)先的去創(chuàng)建這些信息從而直接來使用各個(gè)屬性。

  1、數(shù)據(jù)庫(database)

    a)、創(chuàng)建

      use mydb(創(chuàng)建并切換到名稱為mydb的數(shù)據(jù)庫實(shí)例下。注:如果你對其不進(jìn)行任何操作,該數(shù)據(jù)庫是沒有任何實(shí)際意義的)

  2、集合(collection)

    a)、創(chuàng)建

      我們直接指定,不做任何預(yù)處理,指定一個(gè)名稱為users的數(shù)據(jù)集(相當(dāng)于表),并向其中插入一條用戶數(shù)據(jù)。

      db.users.insert({ "name" : "wjg" , "age" : 24 })

      返回結(jié)果如下,表示你已經(jīng)成功插入了一條數(shù)據(jù):

      WriteResult({ "nInserted" : 1 })

    b)、顯式創(chuàng)建

      僅創(chuàng)建一個(gè)名稱為collectionName的,沒有任何大小和數(shù)量限制的數(shù)據(jù)集

      db.createCollection("collectionName")

      如果該數(shù)據(jù)集有重名,會(huì)給出已經(jīng)存在的提示:

      { "ok" : 0, "errmsg" : "collection already exists", "code" : 48 }

      成功之后會(huì)給出ok的提示:

      { "ok" : 1 }

  3、文檔(document)

    a)、單一插入

      注:如果沒有主鍵“_id”,插入文檔的時(shí)候MongoDB會(huì)為我們自動(dòng)保存一個(gè)進(jìn)去。

這里我們指定一個(gè)“_id”,當(dāng)然了,“_id”肯定是不能重復(fù)的,否則無法插入成功。

      db.users.insert({"_id":0,"name":"jack","age":20})

      成功插入數(shù)據(jù)之后:

      WriteResult({ "nInserted" : 1 })

    b)、批量插入

      注:一次性插入多個(gè)文檔會(huì)明顯提高插入速度;

插入文檔的大小限制為48MB;

如果其中有一個(gè)文檔插入失敗了,這個(gè)文檔之前的都可以插入成功,但是在它之后都會(huì)失??;(不同的驅(qū)動(dòng)可能會(huì)有不同的處理方式)

      db.users.insert([{"_id":1,"name":"tom","age":21},{"_id":2,"name":"joe","age":22},{"_id":3,"name":"bob","age":22}])

      批量插入成功之后會(huì)返回如下信息:

      BulkWriteResult({

"writeErrors":[],

"writeConcernErrors":[],

"nInserted":3,

"nUpserted":0,

"nMatched":0,

"nModified":0,

"nRemoved":0,

"upserted":[]})

      分別表示的大致意思為:

插入的錯(cuò)誤信息,其他的插入錯(cuò)誤信息,插入的文檔數(shù)量,特殊更新的文檔數(shù)量,匹配到的文檔數(shù)量,

更新的文檔數(shù)量,移出的文檔數(shù)量和特殊文檔更新信息

      特殊的文檔更新(upsert),其定義如下:

如果沒有找到符合更新條件的文檔,就會(huì)以這個(gè)條件和更新文檔為基礎(chǔ)創(chuàng)建一個(gè)新的文檔;如果找到了匹配的文檔,那么就正常更新

二、更新

  想要更新文檔,必須要有兩個(gè)參數(shù):

    一個(gè)是查詢條件,用于定位到需要更新的目標(biāo)文檔;另一個(gè)是修改器,用于說明要對找到的文檔進(jìn)行哪些修改

  截至此刻為止,我們已經(jīng)向mydb數(shù)據(jù)庫中名稱為users的數(shù)據(jù)集中添加了如下幾個(gè)文檔:

    a)、單一更新

      讓我們來為名字為bob的年齡增加一歲,直接將年齡更新為23歲

      db.users.update({"name":"bob"},{$set:{"age":23}}) //使用了$set修改器之后,只會(huì)更新age自段的值為23

      或者

      db.users.update({"name":"bob"},{"age":23}) //同樣會(huì)將age自段的值更新為23,但是會(huì)移出除了“_id”和本身之外的所有字段值

      具體詳情如下圖:

      注:如果需要更新的字段不存在,那么MongoDB會(huì)按字段順序進(jìn)行插入,類似于上邊提到的特殊更新。

其實(shí)細(xì)心的童鞋會(huì)發(fā)現(xiàn),我們都是以name作為條件進(jìn)行更新,所以并不能保證其唯一性,那么MongoDB只會(huì)更新匹配到的第一個(gè)文檔。

這里還是建議大家指定一個(gè)唯一的文檔進(jìn)行更新,"_id"可以幫你保證!

    b)、使用選擇器更新(重點(diǎn))

      1、$set修改器

執(zhí)行特殊更新操作;可以修改內(nèi)嵌文檔;甚至可以更改鍵的類型;

Ⅰ、假設(shè)需求改了,我們需要為為所有用戶添加一個(gè)”hobby“的屬性用于存放用戶的喜好,那么我們可以這樣做:

  db.users.update({},{$set:{"hobby":"read"}}) //這樣做是錯(cuò)的,哈哈。。

  更新后的文檔如下:

切記:update方法只會(huì)更新它匹配到的第一個(gè)文檔對象,所以這個(gè)操作只會(huì)將名字為”wjg“的用戶添加一個(gè)”hobby“屬性,其它對象不會(huì)添加

正確方式如下:

db.users.update({},{$set:{"hobby":"write"}},false,true) //第三個(gè)參數(shù)為是否啟用特殊更新,第四個(gè)為是否更新所有匹配的文檔;

這倆參數(shù)默認(rèn)都為false

更新后的文檔如下:

  可以看到我們成功更新了五個(gè)文檔對象

Ⅱ、假設(shè)我們需求又變了,老板說了,每個(gè)用戶的愛好會(huì)有多個(gè)。那么簡單,因?yàn)槲覀兛梢灾苯訉tring類型的hobby屬性改成string數(shù)組類型的

  db.users.update({"_id":0},{"$set":{"hobby":["write","read","paly ping-pong"]}}) //將_id為0的hobby屬性更新為數(shù)組類型的

Ⅲ、然后我們發(fā)現(xiàn)tom壓根就沒有愛好,那么我們可以使用$unset修改器將其刪除

  db.users.update({"_id":1},{"$unset":{"hobby":1}}) //1表示徹底刪除這個(gè)鍵值對

Ⅳ、現(xiàn)在已經(jīng)過去一年了,我們是時(shí)候把所有用戶的年齡加一歲了。這時(shí)$inc上場

  db.users.update({},{"$inc":{"age":1}},false,true) //別忘了將第四個(gè)參數(shù)置為true

  注:$inc修改器只針對數(shù)字類型,如果是string或者其他類型的會(huì)提示報(bào)錯(cuò): 

      提示無法將$inc應(yīng)用到非數(shù)字類型上,并且給出錯(cuò)誤位置:”_id“為2的文檔;

      我們將joe的age改為數(shù)字類型的重新執(zhí)行一次,就可以成功啦!

Ⅴ、過了一段時(shí)間,jack又喜歡上了游泳,那么我們可以用$push這樣搞:

  db.users.update({"_id":0},{"$push":{"hobby":"swim"}}) //hobby必須是一個(gè)數(shù)組,所以你在其他文檔上使用是不會(huì)成功的

Ⅵ、然而jack不喜歡讀書了,我們就用$pull來移除“read”元素

  db.users.update({"_id":0},{"$pull":{"hobby":"read"}}) //它會(huì)移除數(shù)組中所有匹配到的“read”元素

  另外:db.users.update({"_id":0},{"$pop":{"hobby":1}}) //表示移除hobby中的最后一個(gè)元素,為-1表示移除第一個(gè)元素

  不知道大家有沒有發(fā)現(xiàn),“_id”為0的文檔從第二的位置被移動(dòng)到了數(shù)據(jù)集的末尾,這是因?yàn)樵撐臋n尺寸變大的原因?qū)е碌模?/p>

  原先的位置已經(jīng)容不下它了!

  那么這就引出了另外一個(gè)概念:填充因子,它是MongoDB為每個(gè)新文檔預(yù)留的增長空間。上邊的這種情況就會(huì)使填充因子增加。

  移動(dòng)文檔是一個(gè)非常緩慢的操作,盡量讓填充因子的值接近1;

  通過db.users.stats()查看該數(shù)據(jù)集信息,“paddingFactor”即為填充因子的大小;

三、刪除

  刪除文檔相對來說就簡單了許多

  1、單一刪除

    給定一個(gè)查詢參數(shù),只要符合條件的,都會(huì)被刪除

    db.users.remove({"_id":{"$lte":1}}) //刪除“_id”的值小于等于1的所有文檔

    返回結(jié)果如下:

    WriteResult({"nRemoved":2}) //成功刪除了兩個(gè)文檔

  2、清空整個(gè)數(shù)據(jù)集

    db.users.remove()

    如果數(shù)據(jù)較多的話,用db.users.drop()會(huì)明顯提升刪除速度

  注:刪除都是不可逆的,不能撤銷,也不能恢復(fù),所以要謹(jǐn)慎使用;

    清空數(shù)據(jù)集的時(shí)候集合本身并不會(huì)被刪除,也不會(huì)刪除集合的元信息;

四、未解決問題

  1、先取出來再更新,使用查詢條件取出來的數(shù)據(jù)都無法用游標(biāo)去獲取值,但是用findOne獲取的一個(gè)文檔對象就可以。。。

    如果哪位大神知道的話麻煩告訴小弟一下,多謝、、、哈哈。。

  最后一個(gè)問題已經(jīng)找到,原因如下:

    第一個(gè)find操作雖然獲取的只是一個(gè)文檔對象,看似和下邊用findOne是一樣的效果,但是在MongoDB的shell中第一個(gè)的結(jié)果集是被默認(rèn)為多個(gè)文檔集合,所以它無法判斷你想獲取的是哪個(gè)文檔的age。

相關(guān)文章

  • 基于MongoDB實(shí)現(xiàn)聊天記錄的存儲(chǔ)問題小結(jié)

    基于MongoDB實(shí)現(xiàn)聊天記錄的存儲(chǔ)問題小結(jié)

    MongoDB是一個(gè)高性能、易部署、易使用的數(shù)據(jù)庫系統(tǒng),具有豐富的功能和特點(diǎn),適用于各種規(guī)模的應(yīng)用程序和場景,這篇文章給大家介紹基于MongoDB實(shí)現(xiàn)聊天記錄的存儲(chǔ)問題,感興趣的朋友一起看看吧
    2024-02-02
  • MongoDB優(yōu)化心得分享

    MongoDB優(yōu)化心得分享

    本文給大家分享的是一些使用mongoDB優(yōu)化方面的心得,有需要的小伙伴可以參考下
    2017-12-12
  • 2021最新版windows10系統(tǒng)MongoDB數(shù)據(jù)庫安裝及配置環(huán)境

    2021最新版windows10系統(tǒng)MongoDB數(shù)據(jù)庫安裝及配置環(huán)境

    這篇文章主要介紹了2021最新版MongoDB數(shù)據(jù)庫安裝及配置環(huán)境(windows10系統(tǒng)),本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • MongoDB聚合分組取第一條記錄的案例與實(shí)現(xiàn)方法

    MongoDB聚合分組取第一條記錄的案例與實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于MongoDB聚合分組取第一條記錄的案例與實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • MongoDB最基本命令速查筆記

    MongoDB最基本命令速查筆記

    這篇文章主要介紹了一些MongoDB最基本命令的這樣一個(gè)速查筆記,包括MongoDB非正常關(guān)閉后無法啟動(dòng)問題的解決方法,需要的朋友可以參考下
    2016-01-01
  • MongoDB教程之聚合(count、distinct和group)

    MongoDB教程之聚合(count、distinct和group)

    這篇文章主要介紹了MongoDB教程之聚合,MongoDB除了基本的查詢功能之外,還提供了強(qiáng)大的聚合功能,這里主要介紹count、distinct和group,需要的朋友可以參考下
    2015-05-05
  • mongodb 修改器($inc/$set/$unset/$push/$pop/upsert)

    mongodb 修改器($inc/$set/$unset/$push/$pop/upsert)

    對于文檔的更新除替換外,針對某個(gè)或多個(gè)文檔只需要部分更新可使用原子的更新修改器,能夠高效的進(jìn)行文檔更新。更新修改器是中特殊的鍵
    2017-04-04
  • Mongodb常用的身份驗(yàn)證方式

    Mongodb常用的身份驗(yàn)證方式

    對MongoDB部署啟用訪問控制會(huì)強(qiáng)制執(zhí)行用戶身份驗(yàn)證,要求在登錄MongoDB系統(tǒng)用戶識(shí)別自己。 當(dāng)訪問啟用了訪問控制的MongoDB部署時(shí),用戶只能執(zhí)行由其角色確定的操作。
    2017-08-08
  • mongodb 中rs.stauts()命令參數(shù)解析

    mongodb 中rs.stauts()命令參數(shù)解析

    MongoDB的rs.status()命令是查看副本集狀態(tài)的重要工具,它可以展示副本集中各個(gè)成員的角色、健康狀態(tài)、同步進(jìn)度等關(guān)鍵信息,本文介紹mongodb 中rs.stauts()命令參數(shù)解析,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • 利用MongoDB中oplog機(jī)制實(shí)現(xiàn)準(zhǔn)實(shí)時(shí)數(shù)據(jù)的操作監(jiān)控

    利用MongoDB中oplog機(jī)制實(shí)現(xiàn)準(zhǔn)實(shí)時(shí)數(shù)據(jù)的操作監(jiān)控

    MongoDB 的Replication是通過一個(gè)日志來存儲(chǔ)寫操作的,這個(gè)日志就叫做oplog,而下面這篇文章主要給大家介紹了利用MongoDB中oplog機(jī)制實(shí)現(xiàn)準(zhǔn)實(shí)時(shí)數(shù)據(jù)的操作監(jiān)控的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-05-05

最新評(píng)論

黔南| 三江| 深圳市| 常州市| 大丰市| 章丘市| 马山县| 介休市| 东兴市| 辰溪县| 五华县| 墨玉县| 呼玛县| 盘锦市| 伊金霍洛旗| 宁津县| 响水县| 遂宁市| 获嘉县| 民和| 长寿区| 乌恰县| 汉川市| 洛扎县| 宜城市| 绥阳县| 辽中县| 武定县| 哈巴河县| 双峰县| 湘潭县| 登封市| 溧水县| 宣恩县| 安仁县| 安平县| 谷城县| 沙湾县| 盈江县| 满洲里市| 宿州市|