SHSubway项目笔记4-mongoDB+JavaScript
Jun 20, 2016
目录结构
- 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 |
然后就静静的等待运行结束吧~
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 | var original = {}; |
新建对象copy,并将对象original赋值给对象copy,然后修改copy的属性a,发现对象original的属性被改变。
【原因】
因为JavaScript存储对象都是存地址的,所以以上复制会导致original和copy指向同一块内存地址,以上对象的复制方式为浅复制。
如果想复制后修改属性,而不改变原对象属性值,可以采用深复制方式,开辟一块新的内存地址,将原对象的各个属性逐个复制过去。
深复制可以使用jQuery的$.extend()函数实现,如下:
1 | var x = { |
【参考】