摘要:例如,假設要刪除集合中所有為的人刪除數據是永久性的,不能撤銷,也不能恢復。刪除速度刪除文檔通常很快,但是如果要清空整個集合,那么使用直接刪除集合會更快然后在這個空集合上重建各項索引。上一篇文章指南基礎知識使用下一篇文章指南更新文檔
上一篇文章:MongoDB指南---4、MongoDB基礎知識-使用MongoDB Shell
下一篇文章:MongoDB指南---6、更新文檔
本章會介紹對數據庫移入/移出數據的基本操作,具體包含如下操作:
向集合添加新文檔;
從集合里刪除文檔;
更新現有文檔;
為這些操作選擇合適的安全級別和速度。
3.1 插入并保存文檔插入是向MongoDB中添加數據的基本方法。可以使用insert方法向目標集合插入一個文檔:
> db.foo.insert({"bar" : "baz"})
這個操作會給文檔自動增加一個"_id"鍵(要是原來沒有的話),然后將其保存到MongoDB中。
3.1.1 批量插入如果要向集合中插入多個文檔,使用批量插入會快一些。使用批量插入,可以將一組文檔傳遞給數據庫。
在shell中,可以使用batchInsert函數實現批量插入,它與insert函數非常像,只是它接受的是一個文檔數組作為參數:
> db.foo.batchInsert([{"_id" : 0}, {"_id" : 1}, {"_id" : 2}]) > db.foo.find() { "_id" : 0 } { "_id" : 1 } { "_id" : 2 }
一次發送數十、數百乃至數千個文檔會明顯提高插入的速度。
只有需要將多個文檔插入到一個集合時,這種方式才會有用。不能在單次請求中將多個文檔批量插入到多個集合中。要是只導入原始數據(例如,從數據feed或者MySQL中導入),可以使用命令行工具,如mongoimport,而不是批量插入。另一方面,可以使用批量插入在將數據存入MongoDB之前對數據做一些小的修整(將日期轉換為日期類型,或添加自定義的"_id"),這樣批量插入也可用于導入數據。
當前版本的MongoDB能接受的最大消息長度是48 MB,所以在一次批量插入中能插入的文檔是有限制的。如果試圖插入48 MB以上的數據,多數驅動程序會將這個批量插入請求拆分為多個48 MB的批量插入請求。具體可以查看所使用的驅動程序的相關文檔。
如果在執行批量插入的過程中有一個文檔插入失敗,那么在這個文檔之前的所有文檔都會成功插入到集合中,而這個文檔以及之后的所有文檔全部插入失敗。
> db.foo.batchInsert([{"_id" : 0}, {"_id" : 1}, {"_id" : 1}, {"_id" : 2}])
只有前兩個文檔會被插入,因為插入第三個文檔時會發生錯誤:集合中已經存在一個_id為1的文檔,不能重復插入。
在批量插入中遇到錯誤時,如果希望batchInsert忽略錯誤并且繼續執行后續插入,可以使用continueOnError選項。這樣就可以將上面例子中的第一個、第二個以及第四個文檔都插入到集合中。Shell并不支持這個選項,但是所有驅動程序都支持。
插入數據時,MongoDB只對數據進行最基本的檢查:檢查文檔的基本結構,如果沒有"_id"字段,就自動增加一個。檢查大小就是其中一項基本結構檢查:所有文檔都必須小于16 MB(這個值是MongoDB設計者人為定的,未來有可能會增加)。作這樣的限制主要是為了防止不良的模式設計,并且保證性能一致。如果要查看doc文檔的BSON大小(單位為字節),可以在shell中執行Object.bsonsize(doc)。
16 MB的數據究竟有多大?要知道整部《戰爭與和平》也才3.14 MB。
由于MongoDB只進行最基本的檢查,所以插入非法數據很容易(如果你想這么干的話)。因此,應該只允許信任的源(比如你的應用程序服務器)連接數據庫。主流語言的所有驅動程序(以及大部分其他語言的驅動程序),都會在將數據插入到數據庫之前做大量的數據校驗(比如文檔是否過大,文檔是否包含非UTF-8字符串,是否使用不可識別的類型)。
現在數據庫中有些數據,要刪除它:
> db.foo.remove()
上述命令會刪除foo集合中的所有文檔。但是不會刪除集合本身,也不會刪除集合的元信息。
remove函數可以接受一個查詢文檔作為可選參數。給定這個參數以后,只有符合條件的文檔才被刪除。例如,假設要刪除mailing.list集合中所有"opt-out"為true的人:
> db.mailing.list.remove({"opt-out" : true})
刪除數據是永久性的,不能撤銷,也不能恢復。
刪除速度刪除文檔通常很快,但是如果要清空整個集合,那么使用drop直接刪除集合會更快(然后在這個空集合上重建各項索引)。
例如,使用如下方法插入一百萬個測試數據:
> for (var i = 0; i < 1000000; i++) { db.tester.insert({"foo": "bar", "baz": i, "z": 10 - i}) }
現在把剛插入的文檔都刪除,并記錄花費的時間。首先使用remove進行刪除:
> 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!速度提升相當明顯,但也是有代價的:不能指定任何限定條件。整個集合都被刪除了,所有元數據也都不見了。
上一篇文章:MongoDB指南---4、MongoDB基礎知識-使用MongoDB Shell
下一篇文章:MongoDB指南---6、更新文檔
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43989.html
摘要:例如,假設要刪除集合中所有為的人刪除數據是永久性的,不能撤銷,也不能恢復。刪除速度刪除文檔通常很快,但是如果要清空整個集合,那么使用直接刪除集合會更快然后在這個空集合上重建各項索引。上一篇文章指南基礎知識使用下一篇文章指南更新文檔 上一篇文章:MongoDB指南---4、MongoDB基礎知識-使用MongoDB Shell下一篇文章:MongoDB指南---6、更新文檔 本章會介紹...
摘要:如果沒有找到找到符合條件的文檔,就會以這個條件和更新文檔為基礎新建一個新的文檔。使用它可以快速方便的對文檔進行更新。更新多個文檔默認情況下,文檔的更新只針對第一個匹配到的文檔,多個條件符合時,其它文檔不會改變。 what is MongoDB ? 面向文檔的數據庫 不再有行的概念,不再有預定義模式 易于拓展 豐富的功能 索引 聚合 特殊的集合類型 文件存儲 高性能 可以一個示...
摘要:如果沒有找到找到符合條件的文檔,就會以這個條件和更新文檔為基礎新建一個新的文檔。使用它可以快速方便的對文檔進行更新。更新多個文檔默認情況下,文檔的更新只針對第一個匹配到的文檔,多個條件符合時,其它文檔不會改變。 what is MongoDB ? 面向文檔的數據庫 不再有行的概念,不再有預定義模式 易于拓展 豐富的功能 索引 聚合 特殊的集合類型 文件存儲 高性能 可以一個示...
摘要:復合唯一索引也可以創建復合的唯一索引。中的稀疏索引與關系型數據庫中的稀疏索引是完全不同的概念。但是這里不會指明索引是否是多鍵索引。上一篇文章指南使用和何時不應該使用索引下一篇文章指南特殊的索引和集合固定集合索引全文本索引 上一篇文章:MongoDB指南---12、使用explain()和hint()、何時不應該使用索引下一篇文章:MongoDB指南---14、特殊的索引和集合:固定集合...
閱讀 2787·2021-11-17 09:33
閱讀 2169·2021-09-03 10:40
閱讀 522·2019-08-29 18:45
閱讀 2956·2019-08-29 16:21
閱讀 613·2019-08-29 11:11
閱讀 3394·2019-08-26 12:00
閱讀 2947·2019-08-23 18:19
閱讀 1094·2019-08-23 12:18