4、創(chuàng)建、更新和刪除文檔(MongoDB筆記)

一、插入并保存文檔

可以使用insert方法向目標(biāo)集合插入一個(gè)文檔:

> db.test.insert("bar" : "baz")

這個(gè)操作會(huì)給文檔自動(dòng)增加一個(gè)"_id"鍵(要是原來(lái)沒(méi)有的話(huà))。

1.1 批量插入

使用批量插入,可以將一組文檔傳遞給數(shù)據(jù)庫(kù),使用insert函數(shù)實(shí)現(xiàn)批量插入:

1

注意:之前的批量插入函數(shù)batchInsert已經(jīng)過(guò)時(shí)了。直接使用insert函數(shù)就可以。

只有需要將多個(gè)文檔插入到一個(gè)集合時(shí),這種方式才會(huì)有用。不能在單次請(qǐng)求中將多個(gè)文檔批量插入到多個(gè)集合中。要是只導(dǎo)入原始數(shù)據(jù)(如,從MySQL中導(dǎo)入),可以使用命令行工具,如mongoimport,而不是批量插入。另一方面,可以使用批量插入在將數(shù)據(jù)存入MongoDB之前對(duì)數(shù)據(jù)做一個(gè)小的修改(如將日期轉(zhuǎn)換為日期類(lèi)型,或添加自定義的"_id"),這樣批量插入也可以用于導(dǎo)入數(shù)據(jù)。

當(dāng)前版本的MongoDB能接受的最大消息長(zhǎng)度是48MB,所以在一次批量插入中能插入的文檔是有限制的。如果試圖插入48MB以上的數(shù)據(jù),多數(shù)驅(qū)動(dòng)程序會(huì)將這個(gè)批量插入的請(qǐng)求拆分為多個(gè)48MB的批量插入請(qǐng)求。

如果在執(zhí)行批量插入的過(guò)程中有一個(gè)文檔插入失敗,那么在這個(gè)文檔之前的所有文檔都會(huì)成功插入到集合中,而這個(gè)文檔及之后的所有文檔全部插入失敗。


2

1.2 插入校驗(yàn)

檢查大小是一項(xiàng)基本結(jié)構(gòu)檢查:所有文檔都必須小于16MB(這個(gè)值是MongoDB設(shè)計(jì)者人為定的,未來(lái)有可能會(huì)增加)。這個(gè)限制主要是為了防止不良的設(shè)計(jì)模式,并且保證性能一直。可以使用Object.bsonsize(doc)查看文檔的BSON大小(單位為字節(jié))。MongoDB只進(jìn)行最基本的檢查,所以插入非法數(shù)據(jù)很容易。主流語(yǔ)言的所有驅(qū)動(dòng)程序都會(huì)在將數(shù)據(jù)庫(kù)之前做大量的數(shù)據(jù)校驗(yàn)(比如文檔是否過(guò)大,文檔是否包含非UTF-8字符串)

二、刪除文檔

現(xiàn)在數(shù)據(jù)庫(kù)中有些數(shù)據(jù),要?jiǎng)h除它:

> db.test.remove()

上述命令會(huì)刪除test集合中的所有文檔。但是不會(huì)刪除集合本身,也不會(huì)刪除集合的元信息。remove函數(shù)可以接受一個(gè)查詢(xún)文檔作為可選參數(shù)。給定這個(gè)參數(shù)以后,只有符合條件的文檔才被刪除。例如,假設(shè)要?jiǎng)h除mailing.list集合中所有"opt-out"true的人:

> db.mailing.list.remove("opt-out" : true)

刪除數(shù)據(jù)是永久的,不能撤銷(xiāo),也不能恢復(fù)。

2.1 刪除速度

刪除文檔通常很快,但是如果要清空整個(gè)集合,那么使用drop直接刪除集合會(huì)更快(然后在這個(gè)空集合上重建各項(xiàng)索引)。在刪除大量數(shù)據(jù)時(shí)使用db.test.drop()代替removefindOne效率會(huì)更高,但是不能指定任何限定條件。結(jié)果是整個(gè)集合都被刪除了,所有元數(shù)據(jù)也都不見(jiàn)了。

三、更新文檔

文檔存入數(shù)據(jù)庫(kù)以后,就可以使用update方法來(lái)更新它。update有兩個(gè)參數(shù),一個(gè)是查詢(xún)文檔,用于定位需要更新的目的文檔;另一個(gè)是修改器文檔,用于說(shuō)明要對(duì)找到的文檔進(jìn)行哪些修改。
未完待續(xù)。。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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