目錄結(jié)構(gòu)
- 1.mongoDB執(zhí)行js腳本
- 2.mongoDB大量刪除數(shù)據(jù)空間釋放問(wèn)題
- 3.JavaScript中深復(fù)制和淺復(fù)制
**1.mongoDB執(zhí)行js腳本 **
一直用roboMongo做mongoDB的管理,界面很清晰很好用,直到執(zhí)行運(yùn)行時(shí)間很久很耗內(nèi)存的命令,roboMongo一次又一次的崩潰,發(fā)現(xiàn)還是shell靠譜抗造。
mongoDB的shell是JavaScript實(shí)現(xiàn)的,用shell執(zhí)行js腳本方便穩(wěn)定。
- 將js腳本保存到mongoDB的bin目錄下
- 命令行工具進(jìn)入bin目錄,執(zhí)行以下操作
mongo 127.0.0.1:27017/dbName –quiet test.js
然后就靜靜的等待運(yùn)行結(jié)束吧~
【參考】
mongodb執(zhí)行js腳本(一)---shell執(zhí)行
2.mongoDB大量刪除數(shù)據(jù)空間釋放問(wèn)題
在刪除數(shù)據(jù)的過(guò)程中,發(fā)現(xiàn)一個(gè)奇怪的現(xiàn)象,原本數(shù)據(jù)庫(kù)25.5G,有413562171個(gè)文檔。我執(zhí)行了下面的操作:
db.collectionName.remove( { xxx: "xxx" } )
這個(gè)操作刪除了165540416個(gè)文檔之后,數(shù)據(jù)庫(kù)的大小竟然不減反加,變成25.8G。這讓我非常困惑。
【原因】
在Stack Overflow提問(wèn),原來(lái)是mongoDB不會(huì)自動(dòng)釋放空間,它認(rèn)為這些空間在以后新建文檔的時(shí)候還能用到。
【手動(dòng)釋放空間】
如果想釋放這些空間,可以使用repairDatabase
mongo shell命令為:
db.repairDatabase()
或者命令行工具在mongoDB安裝bin目錄下執(zhí)行
mongod --repair
【參考】
Why the mongodb database take more space after removing documents
3.JavaScript中深復(fù)制和淺復(fù)制
先看如下代碼:
var original = {};
original.a = 'abc';
var copy = original;
copy.a = 'xxx';
console.log(original.a);// 輸出xxx
新建對(duì)象copy,并將對(duì)象original賦值給對(duì)象copy,然后修改copy的屬性a,發(fā)現(xiàn)對(duì)象original的屬性被改變。
【原因】
因?yàn)镴avaScript存儲(chǔ)對(duì)象都是存地址的,所以以上復(fù)制會(huì)導(dǎo)致original和copy指向同一塊內(nèi)存地址,以上對(duì)象的復(fù)制方式為淺復(fù)制。
如果想復(fù)制后修改屬性,而不改變?cè)瓕?duì)象屬性值,可以采用深復(fù)制方式,開(kāi)辟一塊新的內(nèi)存地址,將原對(duì)象的各個(gè)屬性逐個(gè)復(fù)制過(guò)去。
深復(fù)制可以使用jQuery的$.extend()函數(shù)實(shí)現(xiàn),如下:
var x = {
a: 1,
b: { f: { g: 1 } },
c: [ 1, 2, 3 ]
};
var y = $.extend({}, x), // 淺復(fù)制
z = $.extend(true, {}, x); // 深復(fù)制
y.b.f === x.b.f // true
z.b.f === x.b.f // false
【參考】