mongodb初体验
如果要选出近两年最火的web技术的话,NOSQL必定为其中之一!鉴于业务量发展的压力,最近项目组也希望完全迁移至NOSQL,所以也关注下NOSQL的知识(之前也有关注,但只是看看介绍而已,没有深入了解),这期间注意到mongodb。不同于Cansandra的key-value形式,mongodb的数据是以文档为单位存储的,mongo中所谓的的文档就是类似于json格式的数据(在mongodb中叫bson),文档是存放于集合(collection)之下的,实际应用中,这里的集合就相当于关系数据库中的表,而一个文档就相当于表中的一行数据,不过mongodb的好处是,collection下可以存放任何符合bson格式的文档,而关系数据库的表中存放的数据是预定义好的,不可变的(几乎),这一点上mongodb非常符合我们不断变化的业务。
mongodb的安装非常简单:
- 先到http://www.mongodb.org/downloads下载最新稳定版的mongodb包,解压到你希望存放的任何目录;打开看看mongodb目录看看,里面的文件很少,只有bin目录下有10个可执行文件,其中mongod.exe就是mongodb核心服务,mongo.exe是其一个命令行客户端,简单称之为mongo shell。
- 如果使用的windows,在mongodb所在的盘的根目录下建一个data目录,再到data目录下建一个db目录;如果使用的是linux/unix,运行如下两个命令就行:sudo mkdir -p /data/db/ ; sudo chown `id -u` /data/db。因为mongodb默认会把数据存放到其所在盘下的data/db目录下(linux下就是/data/db),而它发现这个目录不存在时又不会自己去创建这个目录(sb),所以必须得我们手工创建目录。当然mongodb也可以不是用默认目录,启动时指定--dbpath参数即可。就这么简单,单机下的db就安装工作就安装就绪了……下面体验下mongodb。
体验mongodb:
- 进入mongodb/bin目录,运行mongodb.exe,这样mongodb服务就启动了。
- 再打开mongo.exe,启动mongo shell,默认它会自动连接到本地mongodb服务,并默认使用一个名字为test的数据库,并将database实例赋给db变量(mongo shell里使用的是javascript脚本操作数据库),如下:
- 先插入一条是数据试试,输入命令:db.picture.insert({picId:1,picSize:1999201,deleted:0}); 中间的picture就是我们指定的一个集合,而insert的参数就是我们要插入的文档数据,再输入db.picture.find()查询看看数据是否写入,截图如下:
查询结果就是我们刚刚插入的一条记录,不过多了一个"_id"属性,这个是mongodb自动生成的,不可删除,mongodb会在这个字段上建索引。另外注意,文档必须是某一个集合之下的,picture是之前并不存在的集合,mongodb如果发现集合不存在会自动创建一个集合。 - 插入另外一个结构完全不同的文档试试,执行db.picture.insert({a:1,b:2}),再执行db.picture.find()查询看看:
picture集合下有两个完全不同的文档。 - 弄个复杂点的(在mongo shell里是可以执行javascript脚本的): for(i=2;i<10;i++)db.picture.insert({picId:i,picSize:10000,deleted:i%2});
然后在查询看看:
帅! - 为了适合客户需求,我们要给图片添加个短地址,短地址的规则是:一级图片类别/二级图片类别/图片名,看看我如何给图片动态添加个字段的:db.picture.update({picId:9},{$set:{shortUrl:"/cat1/cat2/pic1"}});执行完后查询看看
picId为9的那条记录已经多了个shortUrl属性,我们的业务已经完全不在局限于数据库的设计了,因为我们随时可以动态的修改它!
简单的体验了mongodb,它的功能确实非常强大,特别在可扩展性方面,还有其对javascript的支持,感觉与Node.js是天生的一对, 哈哈……有空再慢慢研究。