SHSubway項(xiàng)目筆記3-mongoDB+JavaScript

目錄結(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

【參考】

javascript中的深拷貝和淺拷貝?
深入剖析 JavaScript 的深復(fù)制

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容