目录结构

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

1.mongoDB执行js脚本

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

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

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

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

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

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

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

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

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

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

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

mongo shell命令为:

1
db.repairDatabase()

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

1
mongod --repair

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

3.JavaScript中深复制和浅复制

先看如下代码:

1
2
3
4
5
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()函数实现,如下:

1
2
3
4
5
6
7
8
9
10
11
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 的深复制