MONGO學(xué)習(xí)筆記(三俗批、MongoDB CURD)

MongoDB的語(yǔ)法和傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)語(yǔ)法不同,它調(diào)用的是JavaScript提供的API接口。例如:

添加數(shù)據(jù)

單行數(shù)據(jù)插入(insert)

use appdb 
db.book.insert({
  title: 'my first book',
  publishedData : new Date(),
  tags: [
  'MongoDB',
  'nosql'
  ],
  favCount: 25,
  author: 'zale' ,
})
請(qǐng)?zhí)砑訄D片描述

WriteResult({ "nInserted" : 1 }) 表示插入數(shù)據(jù)成功

由于MongoDB屬于文檔型數(shù)據(jù)庫(kù)在跳,它不像關(guān)系型數(shù)據(jù)庫(kù)一樣有著特定的格式,所以你可以在數(shù)據(jù)庫(kù)中插入任意結(jié)構(gòu)數(shù)據(jù)隐岛,但不推薦這樣做;例如

db.book.insert({
    title:'我的第一本書',
    author:"liuliuliu",
    icon: "這是書的封面",
    utl:'http://book.zhouhc.test.com'
})
請(qǐng)?zhí)砑訄D片描述

這時(shí)的數(shù)據(jù)庫(kù)中:


請(qǐng)?zhí)砑訄D片描述

表結(jié)構(gòu)為:


請(qǐng)?zhí)砑訄D片描述

無(wú)限制的插入猫妙,項(xiàng)目必然無(wú)法維護(hù)。

批量插入

批量插入用到的方法:

db.book.insertMany();

以下是例子:

db.book.insertMany([{
    title:'批量插入',
    author:'zhohc',
    publishedData: new Date(),
    tags:['mongo', '批量插入'],
    favCount: 19
}, {
    title:'批量插入',
    author:'zhohc',
    publishedData: new Date(),
    tags:['mongo', '批量插入'],
    favCount: 19
}])

該語(yǔ)句的執(zhí)行結(jié)果如下:


請(qǐng)?zhí)砑訄D片描述
請(qǐng)?zhí)砑訄D片描述

當(dāng)然也可以通過(guò)js腳本的方式批量插入數(shù)據(jù), 如下:


請(qǐng)?zhí)砑訄D片描述

這段js腳本會(huì)向MongoDB中插入20條數(shù)據(jù).這里就不執(zhí)行,想試的可以自己去弄聚凹。

查詢文檔(find)

查詢?nèi)繑?shù)據(jù)

db.collection.find()方法可以用于集合數(shù)據(jù)的查詢割坠,代碼如下:

db.book.find()
請(qǐng)?zhí)砑訄D片描述

如果查詢返回的條目數(shù)量比較多齐帚,Mongo shell則會(huì)自動(dòng)實(shí)現(xiàn)分批查詢,默認(rèn)情況下每次顯示20條數(shù)據(jù)彼哼,可以輸入it命令讀取下一批对妄。
實(shí)際上,find命令返回的是一個(gè)游標(biāo)(cursor)對(duì)象敢朱,Mongo shell對(duì)batchSize做了限制剪菱,該大小可以通過(guò)變量DBQuery.shellBatchSize修改。
使用游標(biāo)對(duì)象提供的API拴签,可以對(duì)全部結(jié)果集進(jìn)行遍歷孝常,代碼如下:

var cursor = db.book.find()
cursor.forEach(printjson)

執(zhí)行結(jié)果如下:


請(qǐng)?zhí)砑訄D片描述

指定條件查詢

準(zhǔn)備數(shù)據(jù)

db.aaa.insert({id: 1, user:'zhouhc1', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 2, user:'zhouhc2', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 3, user:'zhouhc3', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 4, user:'zhouhc4', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 5, user:'zhouhc5', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 6, user:'zhouhc6', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 7, user:'zhouhc7', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 8, user:'zhouhc8', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 9, user:'zhouhc9', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 10, user:'zhouhc10', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 11, user:'zhouhc11', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 12, user:'zhouhc12', pwd:'hello', icon: '圖標(biāo)'})

請(qǐng)?zhí)砑訄D片描述

幾種常見的操作
MongoDB的比較操作符見下表
請(qǐng)?zhí)砑訄D片描述

幾種邏輯運(yùn)算符
請(qǐng)?zhí)砑訄D片描述

數(shù)組運(yùn)算符


請(qǐng)?zhí)砑訄D片描述
  1. 查詢id為"1"的用戶信息
db.aaa.find({id: 1})
請(qǐng)?zhí)砑訄D片描述
  1. 查詢用戶ID大于5的用戶信息
db.aaa.find({id: {$gt: 5}})

該語(yǔ)句執(zhí)行結(jié)果如下:


請(qǐng)?zhí)砑訄D片描述
  1. 排序,分頁(yè)
  • 查詢用戶ID大于5的用戶信息,且按照id降序
    db.aaa.find({id:{$gt: 5}}).sort({id: -1})
    
    該語(yǔ)句執(zhí)行結(jié)果如下:
請(qǐng)?zhí)砑訄D片描述
  • 分頁(yè)查詢
    分頁(yè)查詢主要有兩個(gè)參數(shù)

    • skip: 用于指定跳過(guò)記錄數(shù)
    • limit: 用于限定返回結(jié)果數(shù)

    例如:
    查詢id>5的用戶,且按照每頁(yè)2條數(shù)據(jù)進(jìn)行分頁(yè),取第二頁(yè)

    db.aaa.find({id: {$gt: 5}}).skip(2).limit(2)
    
請(qǐng)?zhí)砑訄D片描述

更新文檔(update)

更新操作符

請(qǐng)?zhí)砑訄D片描述

請(qǐng)?zhí)砑訄D片描述

基本語(yǔ)法格式

MongoDB中可以用update命令對(duì)指定的數(shù)據(jù)進(jìn)行更新,命令的格式如下:

db.{collection}.update(query, update, options)

參數(shù)說(shuō)明:

  • query: 描述更新的查詢條件
  • update: 描述更新的動(dòng)作以及新的內(nèi)容
  • options: 描述更新的選項(xiàng)
  1. 更新單條數(shù)據(jù)
    例如: 將id = 1的用戶,用戶名修改為liuliuliu,
db.aaa.update({id: 1},{$set: {user: 'liuliuliu'}})

該語(yǔ)句執(zhí)行結(jié)果如下:


請(qǐng)?zhí)砑訄D片描述

通過(guò)查詢,可以看到id=1的數(shù)據(jù)user已經(jīng)更新了

請(qǐng)?zhí)砑訄D片描述

默認(rèn)情況下,update命令在更新第一個(gè)文檔之后返回。(也就是說(shuō)蚓哩,默認(rèn)情況下update命令只更新一個(gè)文檔),如果需要更新多條數(shù)據(jù)构灸,如下

  1. 更新多條數(shù)據(jù)
    更新多條數(shù)據(jù)用到Options參數(shù)multi
    參數(shù)介紹
  • multi: 是否更新多條數(shù)據(jù),默認(rèn)false
    基礎(chǔ)語(yǔ)法如下:
db.aaa.update(
    {id: {$gt : 10}}, 
    {$set: {user: 'liuliuliu'}},
    {multi: true}
)

上面這個(gè)更新語(yǔ)句是說(shuō):將所有用戶id>10的用戶岸梨,user修改為liuliuliu

請(qǐng)?zhí)砑訄D片描述

通過(guò)命令可以看到喜颁,id in (11,12)的兩條數(shù)據(jù)已經(jīng)修改為:liuliuliu了

請(qǐng)?zhí)砑訄D片描述
  1. 其他指令
  • updateOne: 更新單個(gè)文檔

  • updateMany: 更新多個(gè)文檔

  • replaceOne: 替換單個(gè)文檔

  • findAndMondify: 這個(gè)命令兼容查詢和修改指定文檔的功能,如下圖


    請(qǐng)?zhí)砑訄D片描述

    默認(rèn)返回的是舊數(shù)據(jù)曹阔,可以通過(guò)選項(xiàng): new:true,返回最新的結(jié)果
    例如:


    請(qǐng)?zhí)砑訄D片描述
  1. 其他
  • upsert命令
    upsert是一種特殊的更新的命令半开,其表現(xiàn)為如果目標(biāo)文檔不存在,則執(zhí)行插入命令次兆,代碼如下:


    請(qǐng)?zhí)砑訄D片描述

刪除文檔(delete)

刪除單個(gè)文檔

執(zhí)行下面的命令可以刪除單個(gè)文檔

db.aaa.remove({id:11})

請(qǐng)?zhí)砑訄D片描述

可以看到文檔已經(jīng)刪除了稿茉, 查詢結(jié)果如下
請(qǐng)?zhí)砑訄D片描述

注意:刪除命令會(huì)刪除所有匹配條件的全部文檔,如果希望明確限定只刪除一個(gè)文檔芥炭,則需要指定justOne參數(shù)漓库。
命令格式如下:

db.collection.remove({
  <query>,
  <justOne>
})

例如:

db.collection.remove({id: 1}, true)

在MongoDB 3.2版本提供了delete語(yǔ)法定義,因此也可以使用deleteOne命令實(shí)現(xiàn)刪除單個(gè)文檔园蝠。
例如:

db.aaa.deleteOne({user: 'liuliuliu'})
請(qǐng)?zhí)砑訄D片描述

刪除全部文檔

刪除全部文檔有三種方式渺蒿,如下:

db.aaa.remove({})
db.aaa.deleteMany({})
db.aaa.drop()

方式1、2需要對(duì)查詢范圍內(nèi)的文檔逐個(gè)刪除彪薛,如果希望刪除整個(gè)集合(表)茂装,則使用drop命令會(huì)更加高效。
drop命令會(huì)同時(shí)刪除集合的全部索引善延。

返回被刪除的數(shù)據(jù)

如果希望返回刪除的數(shù)據(jù)可以使用命令:findOneAndDelete命令少态, 示例如下:

db.aaa.findOneAndDelete({id: 10})

執(zhí)行結(jié)果如下:


請(qǐng)?zhí)砑訄D片描述

小結(jié)

請(qǐng)?zhí)砑訄D片描述

參考

《MongoDB進(jìn)階與實(shí)戰(zhàn):微服務(wù)整合、性能優(yōu)化易遣、架構(gòu)管理》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末彼妻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侨歉,老刑警劉巖屋摇,帶你破解...
    沈念sama閱讀 212,294評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異幽邓,居然都是意外死亡炮温,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門牵舵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)柒啤,“玉大人,你說(shuō)我怎么就攤上這事棋枕“仔蓿” “怎么了妒峦?”我有些...
    開封第一講書人閱讀 157,790評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵重斑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我肯骇,道長(zhǎng)窥浪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,595評(píng)論 1 284
  • 正文 為了忘掉前任笛丙,我火速辦了婚禮漾脂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胚鸯。我一直安慰自己骨稿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評(píng)論 6 386
  • 文/花漫 我一把揭開白布姜钳。 她就那樣靜靜地躺著坦冠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哥桥。 梳的紋絲不亂的頭發(fā)上辙浑,一...
    開封第一講書人閱讀 49,906評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音拟糕,去河邊找鬼判呕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛送滞,可吹牛的內(nèi)容都是我干的侠草。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼犁嗅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼边涕!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起愧哟,我...
    開封第一講書人閱讀 37,797評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤奥吩,失蹤者是張志新(化名)和其女友劉穎哼蛆,沒(méi)想到半個(gè)月后拾并,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裹刮,經(jīng)...
    沈念sama閱讀 44,250評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評(píng)論 2 327
  • 正文 我和宋清朗相戀三年斗埂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了端衰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叠洗。...
    茶點(diǎn)故事閱讀 38,711評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖旅东,靈堂內(nèi)的尸體忽然破棺而出灭抑,到底是詐尸還是另有隱情,我是刑警寧澤抵代,帶...
    沈念sama閱讀 34,388評(píng)論 4 332
  • 正文 年R本政府宣布腾节,位于F島的核電站,受9級(jí)特大地震影響荤牍,放射性物質(zhì)發(fā)生泄漏案腺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評(píng)論 3 316
  • 文/蒙蒙 一康吵、第九天 我趴在偏房一處隱蔽的房頂上張望劈榨。 院中可真熱鬧,春花似錦晦嵌、人聲如沸同辣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)旱函。三九已至,卻和暖如春棕兼,著一層夾襖步出監(jiān)牢的瞬間陡舅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工伴挚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留靶衍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,461評(píng)論 2 360
  • 正文 我出身青樓茎芋,卻偏偏與公主長(zhǎng)得像颅眶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子田弥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容