一瞻想、插入并保存文檔
可以使用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)批量插入:
注意:之前的批量插入函數(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è)文檔及之后的所有文檔全部插入失敗今布。
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()
代替remove
和findOne
效率會(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ù)。荠藤。祈远。