摘要:例如,假設(shè)要刪除集合中所有為的人刪除數(shù)據(jù)是永久性的,不能撤銷,也不能恢復(fù)。刪除速度刪除文檔通常很快,但是如果要清空整個集合,那么使用直接刪除集合會更快然后在這個空集合上重建各項索引。上一篇文章指南基礎(chǔ)知識使用下一篇文章指南更新文檔
上一篇文章:MongoDB指南---4、MongoDB基礎(chǔ)知識-使用MongoDB Shell
下一篇文章:MongoDB指南---6、更新文檔
本章會介紹對數(shù)據(jù)庫移入/移出數(shù)據(jù)的基本操作,具體包含如下操作:
向集合添加新文檔;
從集合里刪除文檔;
更新現(xiàn)有文檔;
為這些操作選擇合適的安全級別和速度。
3.1 插入并保存文檔插入是向MongoDB中添加數(shù)據(jù)的基本方法。可以使用insert方法向目標(biāo)集合插入一個文檔:
> db.foo.insert({"bar" : "baz"})
這個操作會給文檔自動增加一個"_id"鍵(要是原來沒有的話),然后將其保存到MongoDB中。
3.1.1 批量插入如果要向集合中插入多個文檔,使用批量插入會快一些。使用批量插入,可以將一組文檔傳遞給數(shù)據(jù)庫。
在shell中,可以使用batchInsert函數(shù)實現(xiàn)批量插入,它與insert函數(shù)非常像,只是它接受的是一個文檔數(shù)組作為參數(shù):
> db.foo.batchInsert([{"_id" : 0}, {"_id" : 1}, {"_id" : 2}]) > db.foo.find() { "_id" : 0 } { "_id" : 1 } { "_id" : 2 }
一次發(fā)送數(shù)十、數(shù)百乃至數(shù)千個文檔會明顯提高插入的速度。
只有需要將多個文檔插入到一個集合時,這種方式才會有用。不能在單次請求中將多個文檔批量插入到多個集合中。要是只導(dǎo)入原始數(shù)據(jù)(例如,從數(shù)據(jù)feed或者M(jìn)ySQL中導(dǎo)入),可以使用命令行工具,如mongoimport,而不是批量插入。另一方面,可以使用批量插入在將數(shù)據(jù)存入MongoDB之前對數(shù)據(jù)做一些小的修整(將日期轉(zhuǎn)換為日期類型,或添加自定義的"_id"),這樣批量插入也可用于導(dǎo)入數(shù)據(jù)。
當(dāng)前版本的MongoDB能接受的最大消息長度是48 MB,所以在一次批量插入中能插入的文檔是有限制的。如果試圖插入48 MB以上的數(shù)據(jù),多數(shù)驅(qū)動程序會將這個批量插入請求拆分為多個48 MB的批量插入請求。具體可以查看所使用的驅(qū)動程序的相關(guān)文檔。
如果在執(zhí)行批量插入的過程中有一個文檔插入失敗,那么在這個文檔之前的所有文檔都會成功插入到集合中,而這個文檔以及之后的所有文檔全部插入失敗。
> db.foo.batchInsert([{"_id" : 0}, {"_id" : 1}, {"_id" : 1}, {"_id" : 2}])
只有前兩個文檔會被插入,因為插入第三個文檔時會發(fā)生錯誤:集合中已經(jīng)存在一個_id為1的文檔,不能重復(fù)插入。
在批量插入中遇到錯誤時,如果希望batchInsert忽略錯誤并且繼續(xù)執(zhí)行后續(xù)插入,可以使用continueOnError選項。這樣就可以將上面例子中的第一個、第二個以及第四個文檔都插入到集合中。Shell并不支持這個選項,但是所有驅(qū)動程序都支持。
插入數(shù)據(jù)時,MongoDB只對數(shù)據(jù)進(jìn)行最基本的檢查:檢查文檔的基本結(jié)構(gòu),如果沒有"_id"字段,就自動增加一個。檢查大小就是其中一項基本結(jié)構(gòu)檢查:所有文檔都必須小于16 MB(這個值是MongoDB設(shè)計者人為定的,未來有可能會增加)。作這樣的限制主要是為了防止不良的模式設(shè)計,并且保證性能一致。如果要查看doc文檔的BSON大?。▎挝粸樽止?jié)),可以在shell中執(zhí)行Object.bsonsize(doc)。
16 MB的數(shù)據(jù)究竟有多大?要知道整部《戰(zhàn)爭與和平》也才3.14 MB。
由于MongoDB只進(jìn)行最基本的檢查,所以插入非法數(shù)據(jù)很容易(如果你想這么干的話)。因此,應(yīng)該只允許信任的源(比如你的應(yīng)用程序服務(wù)器)連接數(shù)據(jù)庫。主流語言的所有驅(qū)動程序(以及大部分其他語言的驅(qū)動程序),都會在將數(shù)據(jù)插入到數(shù)據(jù)庫之前做大量的數(shù)據(jù)校驗(比如文檔是否過大,文檔是否包含非UTF-8字符串,是否使用不可識別的類型)。
現(xiàn)在數(shù)據(jù)庫中有些數(shù)據(jù),要刪除它:
> db.foo.remove()
上述命令會刪除foo集合中的所有文檔。但是不會刪除集合本身,也不會刪除集合的元信息。
remove函數(shù)可以接受一個查詢文檔作為可選參數(shù)。給定這個參數(shù)以后,只有符合條件的文檔才被刪除。例如,假設(shè)要刪除mailing.list集合中所有"opt-out"為true的人:
> db.mailing.list.remove({"opt-out" : true})
刪除數(shù)據(jù)是永久性的,不能撤銷,也不能恢復(fù)。
刪除速度刪除文檔通常很快,但是如果要清空整個集合,那么使用drop直接刪除集合會更快(然后在這個空集合上重建各項索引)。
例如,使用如下方法插入一百萬個測試數(shù)據(jù):
> for (var i = 0; i < 1000000; i++) { db.tester.insert({"foo": "bar", "baz": i, "z": 10 - i}) }
現(xiàn)在把剛插入的文檔都刪除,并記錄花費的時間。首先使用remove進(jìn)行刪除:
> var timeRemoves = function() { ... var start = (new Date()).getTime(); ... ... db.tester.remove(); ... db.findOne(); // makes sure the remove finishes before continuing ... ... var timeDiff = (new Date()).getTime() - start; ... print("Remove took: "+timeDiff+"ms"); ... } > timeRemoves()
在MacBookAir筆記本電腦上,這段腳本輸出“Removetook:9676ms”。
如果用db.tester.drop()代替remove和findOne,只用1 ms!速度提升相當(dāng)明顯,但也是有代價的:不能指定任何限定條件。整個集合都被刪除了,所有元數(shù)據(jù)也都不見了。
上一篇文章:MongoDB指南---4、MongoDB基礎(chǔ)知識-使用MongoDB Shell
下一篇文章:MongoDB指南---6、更新文檔
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/19563.html
摘要:例如,假設(shè)要刪除集合中所有為的人刪除數(shù)據(jù)是永久性的,不能撤銷,也不能恢復(fù)。刪除速度刪除文檔通常很快,但是如果要清空整個集合,那么使用直接刪除集合會更快然后在這個空集合上重建各項索引。上一篇文章指南基礎(chǔ)知識使用下一篇文章指南更新文檔 上一篇文章:MongoDB指南---4、MongoDB基礎(chǔ)知識-使用MongoDB Shell下一篇文章:MongoDB指南---6、更新文檔 本章會介紹...
摘要:如果沒有找到找到符合條件的文檔,就會以這個條件和更新文檔為基礎(chǔ)新建一個新的文檔。使用它可以快速方便的對文檔進(jìn)行更新。更新多個文檔默認(rèn)情況下,文檔的更新只針對第一個匹配到的文檔,多個條件符合時,其它文檔不會改變。 what is MongoDB ? 面向文檔的數(shù)據(jù)庫 不再有行的概念,不再有預(yù)定義模式 易于拓展 豐富的功能 索引 聚合 特殊的集合類型 文件存儲 高性能 可以一個示...
摘要:如果沒有找到找到符合條件的文檔,就會以這個條件和更新文檔為基礎(chǔ)新建一個新的文檔。使用它可以快速方便的對文檔進(jìn)行更新。更新多個文檔默認(rèn)情況下,文檔的更新只針對第一個匹配到的文檔,多個條件符合時,其它文檔不會改變。 what is MongoDB ? 面向文檔的數(shù)據(jù)庫 不再有行的概念,不再有預(yù)定義模式 易于拓展 豐富的功能 索引 聚合 特殊的集合類型 文件存儲 高性能 可以一個示...
摘要:復(fù)合唯一索引也可以創(chuàng)建復(fù)合的唯一索引。中的稀疏索引與關(guān)系型數(shù)據(jù)庫中的稀疏索引是完全不同的概念。但是這里不會指明索引是否是多鍵索引。上一篇文章指南使用和何時不應(yīng)該使用索引下一篇文章指南特殊的索引和集合固定集合索引全文本索引 上一篇文章:MongoDB指南---12、使用explain()和hint()、何時不應(yīng)該使用索引下一篇文章:MongoDB指南---14、特殊的索引和集合:固定集合...
閱讀 2764·2021-11-22 14:45
閱讀 913·2021-10-15 09:41
閱讀 1073·2021-09-27 13:35
閱讀 3696·2021-09-09 11:56
閱讀 2640·2019-08-30 13:03
閱讀 3203·2019-08-29 16:32
閱讀 3311·2019-08-26 13:49
閱讀 776·2019-08-26 10:35