things相當於一個已經創建好的表
命令:
db.things.find({"createTime":{"$gt":"2015-5-21 0:0:0"}}) // 大於某個時間
db.things.find({"createTime":{"$lt":"2014-5-21 0:0:0"}}) // 小於某個時間
db.things.find({"$and":[{"createTime":{"$gt":"2015-5-21 0:0:0"}},{"createTime":{"$lt":"2015-5-22 0:0:0"}}]}) // 某個時間段
--------------------------------
刪除mongodb集合中的數據可以使用remove()函數。remove()函數可以接受一個查詢文檔作為可選參數來有選擇性的刪除符合條件的文檔。remove()函數不會刪除集合本身,同時,原有的索引也同樣不會被刪除。
一、刪除數據
1.帶條件刪除
>db.user.remove({"name":"zhangshan"});
2.刪除所有數據
>db.user.remove({})
3.刪除集合
>db.user.drop()
4.刪除整個數據庫
>show dbs;
>db.user.getDB()
>db.dropDatabase()
刪除文檔是永久性的,不能撤銷,也不能恢復的。因此,在執行remove()函數前先用find()命令來查看下是否正確。
二、回收remove的磁盤空間
mongodb刪除集合后磁盤空間不釋放,用db.repairDatabase()去修復才能釋放。但是在修復的過程中如果出現了非正常的mongodb的掛掉,再次啟動時啟動不了的,需要先修復才可以,可以利用./mongod --repair --dbpath=/data/mongo/,如果你是把數據庫單獨的放在一個文件夾中指定dbpath時就指向要修復的數據庫就可以,修復可能要花費很長的時間,在使用db.repairDatabase()去修復時一定要停掉讀寫,並且mongodb要有備機才可以,不然千萬不要隨便使用db.repairDatabase()來修復數據庫,切記。
回收磁盤空間可以參考:http://blog.csdn.net/mchdba/article/details/8894344
三、mongodb占用空間過大的原因,在官方的FAQ中,提到有如下幾個方面:
1、空間的預分配:為避免形成過多的硬盤碎片,mongodb每次空間不足時都會申請生成一大塊的硬盤空間,而且申請的量從64M、128M、256M那樣的指數遞增,直到2G為單個文件的最大體積。隨着數據量的增加,你可以在其數據目錄里看到這些整塊生成容量不斷遞增的文件。
2、字段名所占用的空間:為了保持每個記錄內的結構信息用於查詢,mongodb需要把每個字段的key-value都以BSON的形式存儲,如果value域相對於key域並不大,比如存放數值型的數據,則數據的overhead是最大的。一種減少空間占用的方法是把字段名盡量取短一些,這樣占用空間就小了,但這就要求在易讀性與空間占用上作為權衡了。我曾建議作者把字段名作個index,每個字段名用一個字節表示,這樣就不用擔心字段名取多長了。但作者的擔憂也不無道理,這種索引方式需要每次查詢得到結果后把索引值跟原值作一個替換,再發送到客戶端,這個替換也是挺耗費時間的。現在的實現算是拿空間來換取時間吧。
3、刪除記錄不釋放空間:這很容易理解,為避免記錄刪除后的數據的大規模挪動,原記錄空間不刪除,只標記“已刪除”即可,以后還可以重復利用。
4、可以定期運行db.repairDatabase()來整理記錄,但這個過程會比較緩慢。
修復master過程:
1、在master做db.repairDatabase(),不起作用;
2、停止slave的同步;
3、對slave作mongodump,備份數據;
4、對master作mongostore,把備份數據恢復,使用–drop參數可以先把原表刪除。
5、恢復slave的同步。
注:對於需要定期清理的數據庫如:保留定期的業務系統日志數據等,可以采用國定大小集合capped collection,限制數據的大小或條數,永遠保留最新的數據。
————————————————
版權聲明:本文為CSDN博主「slimina」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zhu_tianwei/article/details/44514851