02-MongoDB-創(chuàng)建文檔和刪除文檔

創(chuàng)建文檔

1.主鍵

MongoDB的主鍵和MySQL一樣, 也是用于保證每一條數(shù)據(jù)唯一性的

和MySQL不同的是, MongoDB中的主鍵無(wú)需明確指定

  • 每一個(gè)文檔被添加到集合之后, MongoDB都會(huì)自動(dòng)添加主鍵

  • MongoDB中文檔主鍵的名稱叫做 _id

默認(rèn)情況下文檔主鍵是一個(gè)ObjectId類型的數(shù)據(jù)

  • ObjectId類型是一個(gè)12個(gè)字節(jié)字符串(5e8c5ae9-c9d35e-759b-d6847d)

  • 4字節(jié)是存儲(chǔ)這條數(shù)據(jù)的時(shí)間戳

  • 3字節(jié)的存儲(chǔ)這條數(shù)據(jù)的那臺(tái)電腦的標(biāo)識(shí)符

  • 2字節(jié)的存儲(chǔ)這條數(shù)據(jù)的MongoDB進(jìn)程id

  • 3字節(jié)是計(jì)數(shù)器

2.1為什么要使用ObjectId類型數(shù)據(jù)作為主鍵?

因?yàn)镸ongoDB是支持'橫向擴(kuò)展'的數(shù)據(jù)庫(kù)

  • 橫向擴(kuò)展是指'增加數(shù)據(jù)庫(kù)服務(wù)器的臺(tái)數(shù)

  • 縱向擴(kuò)展是指'增加數(shù)據(jù)庫(kù)庫(kù)服務(wù)器的配置'

過(guò)去一個(gè)數(shù)據(jù)庫(kù)只能安裝在一臺(tái)電腦上, 但是每臺(tái)電腦的性能是有峰值的一旦達(dá)到峰值就會(huì)導(dǎo)致服務(wù)器卡頓诉瓦、宕機(jī)限匣、重啟等問(wèn)題.

所以過(guò)去為了防止如上問(wèn)題的出現(xiàn),我們只能不斷的'縱向擴(kuò)展'

也就是不斷的提升服務(wù)器的配置, 讓服務(wù)器能處理更多的請(qǐng)求

但是縱向擴(kuò)展也是有峰值的, 一臺(tái)電腦的配置不可能無(wú)限提升

所以為了解決這個(gè)問(wèn)題就有了分布式數(shù)據(jù)庫(kù)

分布式數(shù)據(jù)庫(kù)是指可以在多臺(tái)電腦上安裝數(shù)據(jù)庫(kù), 然后把多臺(tái)電腦組合成一個(gè)完整的數(shù)據(jù)庫(kù),

在分布式數(shù)據(jù)庫(kù)中,我們可以通過(guò)不斷同步的方式, 讓多臺(tái)電腦都保存相同的內(nèi)容

當(dāng)用戶請(qǐng)求數(shù)據(jù)時(shí), 我們可以把請(qǐng)求派發(fā)給不同的數(shù)據(jù)庫(kù)服務(wù)器處理

當(dāng)某一臺(tái)服務(wù)器宕機(jī)后, 我們還可以繼續(xù)使用其它服務(wù)器處理請(qǐng)求

從而有效的解決了單臺(tái)電腦性能峰值和單臺(tái)電腦宕機(jī)后服務(wù)器不能使用的問(wèn)題

2.2為什么要使用ObjectId類型數(shù)據(jù)作為主鍵?

正是因?yàn)镸ongoDB是一個(gè)分布式數(shù)據(jù)庫(kù), 正是因?yàn)榉植际綌?shù)據(jù)庫(kù)可以把請(qǐng)求派發(fā)給不同的服務(wù)器

所以第一次插入數(shù)據(jù)時(shí), 我們可能派發(fā)給了A服務(wù)器, 插入到了A服務(wù)器的數(shù)據(jù)庫(kù)中

但是第二次插入數(shù)據(jù)時(shí), 我們又可能派發(fā)給了B服務(wù)器, 插入到了B服務(wù)器的數(shù)據(jù)庫(kù)中

但是B服務(wù)器此時(shí)并不知道A服務(wù)器當(dāng)前的主鍵值是多少, 如果通過(guò)MySQL中簡(jiǎn)單的遞增來(lái)保證數(shù)據(jù)的唯一性

那么將來(lái)在多臺(tái)服務(wù)器同步數(shù)據(jù)的時(shí)候就會(huì)出現(xiàn)重復(fù)的情況, 所以MongoDB的主鍵并沒(méi)有使用簡(jiǎn)單的遞增

而是使用了ObjectId類型數(shù)據(jù)作為主鍵

3.是否支持其它類型數(shù)據(jù)作為主鍵?

3.1在MongoDB中支持除了'數(shù)組類型'以外的其它類型數(shù)據(jù)作為主鍵

3.2在MongoDB中甚至還支持將一個(gè)文檔作為另一個(gè)文檔的主鍵(復(fù)合主鍵)

db.person.insert({name: 'css', age: 33});
db.person.insert({_id: 1, name: 'css', age: 33});
#db.person.insert({_id: 1, name: 'csss', age: 33}); #報(bào)錯(cuò)
db.person.insert({_id: '1', name: 'css', age: 33});
db.person.insert({_id: {name:'js', gender: '男'}, name: 'css', age: 33});
#db.person.insert({_id: {name:'js', gender: '男'}, name: 'css', age: 33}); #報(bào)錯(cuò)
db.person.insert({_id: {gender: '男', name:'js'}, name: 'css', age: 33});

寫(xiě)入文檔

1.寫(xiě)入一個(gè)文檔

db.<collection>.insertOne(

    <document>,
    {
        writeConcern: <document>
    }

);

document: 需要寫(xiě)入的文檔

writeConcern: 寫(xiě)入安全級(jí)別

2.安全級(jí)別

用于判斷數(shù)據(jù)是否寫(xiě)入成功,

安全級(jí)別越高, 丟失數(shù)據(jù)風(fēng)險(xiǎn)越小, 但是性能消耗(操作延遲)也就越大

默認(rèn)情況下MongoDB會(huì)開(kāi)啟默認(rèn)的安全些級(jí)別,先不用關(guān)心

3.注意點(diǎn)

在使用insertXXX寫(xiě)入文檔時(shí), 如果調(diào)用insertOne的集合不存在會(huì)自動(dòng)創(chuàng)建

db.person.insertOne({name:'zs', age:18}) 
db.person.find() 
db.student.insertOne({name:'zs', age:18}) #集合不存在會(huì)自動(dòng)創(chuàng)建 db.student.find()

4.其它方式

db.<collection>.save(

? <document>,

? {

? writeConcern: <document>

? }

);

db.person.save({name:'ls', age:19})
db.person.find()
db.teacher.save({name:'ls', age:19}) #集合不存在會(huì)自動(dòng)創(chuàng)建
db.teacher.find()

5.insertOne和save不同

主鍵沖突時(shí)insertOne會(huì)報(bào)錯(cuò),而save會(huì)直接用新值覆蓋久值

db.person.insertOne({_id:1, name:'ww', age:22})
db.person.find()
db.person.insertOne({_id:1, name:'ww', age:22}) #報(bào)錯(cuò)
db.person.save({_id:1, name:'zs', age:66}) #用新數(shù)據(jù)替換久數(shù)據(jù)
db.person.find()

6.寫(xiě)入多個(gè)文檔

db.<collection>.insertMany(

? [<document>, ...],

? {

? writeConcern: <document>,

? ordered: <boolean>

? }

);

ordered: 是否按順序?qū)懭?/p>

ordered默認(rèn)取值是true, 也就是會(huì)嚴(yán)格按照順序?qū)懭?/p>

如果ordered是false, 則不會(huì)按照順序?qū)懭? 但寫(xiě)入效率更高(系統(tǒng)會(huì)自動(dòng)優(yōu)化)

db.person.insertMany(
[{name:'zs', age:18},{name:'ls', age:19},{name:'ww', age:20}],
{}
)
db.person.find()

注意點(diǎn):

如果ordered是true, 前面的文檔出錯(cuò), 后面的所有文檔都不會(huì)被寫(xiě)入

如果ordered是false, 前面的文檔出錯(cuò), 后面的所有文檔也會(huì)被寫(xiě)入


db.person.insertMany(
[{_id:1, name:'zs', age:18},{_id:1, name:'ls', age:19},{_id:2, name:'ww', age:20}],
{ ordered: true }
)
// 如果ordered:true, _id相同,那么后面數(shù)據(jù)不會(huì)插入
db.person.find()

db.person.remove({})

db.person.insertMany(
[{_id:1, name:'zs', age:18},{_id:1, name:'ls', age:19},{_id:2, name:'ww', age:20}],
{ ordered: false }
)
// 如果 order:false, _id相同, 后面的數(shù)據(jù)也會(huì)被插入
db.person.find()

7.Insert寫(xiě)入一個(gè)或多個(gè)文檔

db.<collection>.insert(

? <document> or ,[<document>, ...]

? {

? writeConcern: <document>,

? ordered: <boolean>

? }

);

insertOne和insertMany結(jié)合體

2.注意點(diǎn):

和insertOne/insertMany一樣, 集合不存在會(huì)自動(dòng)創(chuàng)建

和insertOne/insertMany一樣, 主鍵沖突會(huì)報(bào)錯(cuò)

和insertMany一樣, 默認(rèn)都是按順序插入, 前面的文檔出錯(cuò), 后續(xù)所有文檔不會(huì)被插入

刪除文檔

1.刪除文檔

db.<collection>.remove(<query>, <options>)

<query>: 刪除篩選條件

<options>: 刪除額外配置

2.示例

db.person.insert([
{name:'zs', age:18},
{name:'zs', age:19},
{name:'ls', age:20},
{name:'ls', age:21},
{name:'ww', age:22},
{name:'zl', age:23},
])


//2.1刪除所有滿足條件
// 注意點(diǎn): 和update方法不同, remove方法默認(rèn)就會(huì)刪除所有滿足條件的數(shù)據(jù)
db.person.remove({name:'zs'})
//2.2刪除第一個(gè)滿足條件
db.person.remove({name:'ls'},{justOne:true})
//2.3刪除所有文檔
db.person.remove({})
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末羡宙,一起剝皮案震驚了整個(gè)濱河市殴俱,隨后出現(xiàn)的幾起案子估脆,更是在濱河造成了極大的恐慌苟翻,老刑警劉巖再扭,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異肌括,居然都是意外死亡点骑,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)谍夭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)黑滴,“玉大人,你說(shuō)我怎么就攤上這事紧索≡玻” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵珠漂,是天一觀的道長(zhǎng)晚缩。 經(jīng)常有香客問(wèn)我,道長(zhǎng)媳危,這世上最難降的妖魔是什么荞彼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮待笑,結(jié)果婚禮上鸣皂,老公的妹妹穿的比我還像新娘。我一直安慰自己暮蹂,他們只是感情好寞缝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著仰泻,像睡著了一般第租。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上我纪,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天慎宾,我揣著相機(jī)與錄音丐吓,去河邊找鬼。 笑死趟据,一個(gè)胖子當(dāng)著我的面吹牛券犁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汹碱,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼粘衬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了咳促?” 一聲冷哼從身側(cè)響起稚新,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎跪腹,沒(méi)想到半個(gè)月后褂删,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冲茸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年屯阀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轴术。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡难衰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逗栽,到底是詐尸還是另有隱情盖袭,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布彼宠,位于F島的核電站鳄虱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏兵志。R本人自食惡果不足惜醇蝴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一宣肚、第九天 我趴在偏房一處隱蔽的房頂上張望想罕。 院中可真熱鬧,春花似錦霉涨、人聲如沸按价。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)楼镐。三九已至,卻和暖如春往枷,著一層夾襖步出監(jiān)牢的瞬間框产,已是汗流浹背凄杯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秉宿,地道東北人戒突。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像描睦,于是被迫代替她去往敵國(guó)和親膊存。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355