目录结构
- 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
【参考】
网友评论