美文网首页
SHSubway项目笔记3-mongoDB+JavaScrip

SHSubway项目笔记3-mongoDB+JavaScrip

作者: MiaWang | 来源:发表于2016-06-20 19:03 被阅读0次

    目录结构

    • 1.mongoDB执行js脚本
    • 2.mongoDB大量删除数据空间释放问题
    • 3.JavaScript中深复制和浅复制

    **1.mongoDB执行js脚本 **

    一直用roboMongo做mongoDB的管理,界面很清晰很好用,直到执行运行时间很久很耗内存的命令,roboMongo一次又一次的崩溃,发现还是shell靠谱抗造。

    mongoDB的shell是JavaScript实现的,用shell执行js脚本方便稳定。

    • 将js脚本保存到mongoDB的bin目录下
    • 命令行工具进入bin目录,执行以下操作
     mongo 127.0.0.1:27017/dbName –quiet test.js
    

    然后就静静的等待运行结束吧~

    【参考】
    mongodb执行js脚本(一)---shell执行

    2.mongoDB大量删除数据空间释放问题

    在删除数据的过程中,发现一个奇怪的现象,原本数据库25.5G,有413562171个文档。我执行了下面的操作:

    db.collectionName.remove( { xxx: "xxx" } )
    

    这个操作删除了165540416个文档之后,数据库的大小竟然不减反加,变成25.8G。这让我非常困惑。

    【原因】
    在Stack Overflow提问,原来是mongoDB不会自动释放空间,它认为这些空间在以后新建文档的时候还能用到。

    【手动释放空间】
    如果想释放这些空间,可以使用repairDatabase

    mongo shell命令为:

    db.repairDatabase()
    

    或者命令行工具在mongoDB安装bin目录下执行

    mongod --repair
    

    【参考】
    Why the mongodb database take more space after removing documents

    3.JavaScript中深复制和浅复制

    先看如下代码:

    var original = {};
    original.a = 'abc';
    var copy = original;
    copy.a = 'xxx';
    console.log(original.a);// 输出xxx
    

    新建对象copy,并将对象original赋值给对象copy,然后修改copy的属性a,发现对象original的属性被改变。

    【原因】
    因为JavaScript存储对象都是存地址的,所以以上复制会导致original和copy指向同一块内存地址,以上对象的复制方式为浅复制。

    如果想复制后修改属性,而不改变原对象属性值,可以采用深复制方式,开辟一块新的内存地址,将原对象的各个属性逐个复制过去。

    深复制可以使用jQuery的$.extend()函数实现,如下:

    var x = {
        a: 1,
        b: { f: { g: 1 } },
        c: [ 1, 2, 3 ]
    };
    
    var y = $.extend({}, x),        // 浅复制
        z = $.extend(true, {}, x); // 深复制
    
    y.b.f === x.b.f       // true
    z.b.f === x.b.f       // false
    

    【参考】

    javascript中的深拷贝和浅拷贝?
    深入剖析 JavaScript 的深复制

    相关文章

      网友评论

          本文标题: SHSubway项目笔记3-mongoDB+JavaScrip

          本文链接:https://www.haomeiwen.com/subject/yndwdttx.html