mongodb由C++写就,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量数据的处理。关于它的一个最简洁描述为:scalable, high-performance, open source, schema-free, document-oriented database。MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集两者的优势于一身。
安装及使用:
首先在Ubuntu上安装MongoDB。
下载MongoDB, 现在最新的生产版本1.7.0
1. 解压文件.
$ tar -xvf mongodb-linux-i686-1.4.3.tgz
2. 为MongoDB创建数据目录,默认情况下它将数据存储在/data/db
$ sudo mkdir -p /data/db/
$ sudo chown `id -u` /data/db
3. 启动MongoDB服务.
$ cd mongodb-linux-i686-1.4.3/bin
$ ./mongod
4. 打开另一个终端,并确保你在MongoDB的bin目录,输入如下命令.
$ ./mongo
一些概念
一个mongod服务可以有建立多个数据库,每个数据库可以有多张表,这里的表名叫collection,每个 collection可以存放多个文档(document),每个文档都以BSON(binary json)的形式存放于硬盘中,因此可以存储比较复杂的数据类型。它是以单文档为单位存储的,你可以任意给一个或一批文档新增或删除字段,而不会对其它文档造成影响,这就是所谓的schema-free,这也是文档型数据库最主要的优点。跟一般的key-value数据库不一样的是,它的value中存储了结构信息,所以你又可以像关系型数据库那样对某些域进行读写、统计等操作。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。Mongo还可以解决海量数据的查询效率,根据官方文档,当数据量达到50GB以上数据时,Mongo数据库访问速度是MySQL10 倍以上。
BSON
BSON是Binary JSON 的简称,是一个JSON文档对象的二进制编码格式。BSON同JSON一样支持往其它文档对象和数组中再插入文档对象和数组,同时扩展了JSON的数据类型。如:BSON有Date类型和BinDate类型。
BSON被比作二进制的交换格式,如同Protocol Buffers,但BSON比它更“schema-less”,非常好的灵活性但空间占用稍微大一点。
BSON有以下三个特点:
1. 轻量级
2. 跨平台
3. 效率高
命名空间
MongoDB存储BSON对象到collections,这一系列的数据库名和collection名被称为一个命名空间。如同:java.util.List;用来管理数据库中的数据。
索引
mongodb可以对某个字段建立索引,可以建立组合索引、唯一索引,也可以删除索引,建立索引就意味着增加空间开销。默认情况下每个表都会有一个唯一索引:_id,如果插入数据时没有指定_id,服务会自动生成一个_id,为了充分利用已有索引,减少空间开销,最好是自己指定一个 unique的key为_id,通常用对象的ID比较合适,比如商品的ID。
MongoDB常用命令:
超级用户相关:
- use admin
- #增加或修改用户密码
- db.addUser(ixigua,'pwd')
- #查看用户列表
- db.system.users.find()
- #用户认证
- db.auth(ixigua,'pwd')
- #删除用户
- db.removeUser('mongodb')
- #查看所有用户
- show users
- #查看所有数据库
- show dbs
- #查看所有的collection
- show collections
- #查看各collection的状态
- db.printCollectionStats()
- #查看主从复制状态
- db.printReplicationInfo()
- #修复数据库
- db.repairDatabase()
- #设置记录profiling,0=off 1=slow 2=all
- db.setProfilingLevel(1)
- #查看profiling
- show profile
- #拷贝数据库
- db.copyDatabase('mail_addr','mail_addr_tmp')
- #删除collection
- db.mail_addr.drop()
- #删除当前的数据库
- db.dropDatabase()
- 客户端连接:
- /usr/local/mongodb/bin/mongo 8.8.88/ixigualib -u ixigua -p 'pwd'
- 增删改:
- #存储嵌套的对象
- db.foo.save({'name':'ysz','address':{'city':'beijing','post':100096},'phone':[138,139]})
- #存储数组对象
- db.user_addr.save({'Uid':'yushunzhi@sohu.com','Al':['test-1@sohu.com','test-2@sohu.com']})
- #根据query条件修改,如果不存在则插入,允许修改多条记录
- db.foo.update({'yy':5},{'$set':{'xx':2}},upsert=true,multi=true)
- #删除yy=5的记录
- db.foo.remove({'yy':5})
- #删除所有的记录
- db.foo.remove()
- 索引:
- #增加索引:1(ascending),-1(descending)
- db.things.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
- #索引子对象
- db.user_addr.ensureIndex({'Al.Em': 1})
- #查看索引信息
- db.deliver_status.getIndexes()
- db.deliver_status.getIndexKeys()
- #根据索引名删除索引
- db.user_addr.dropIndex('Al.Em_1')
- 查询:
- #查找所有
- db.foo.find()
- #查找一条记录
- db.foo.findOne()
- #根据条件检索10条记录
- db.foo.find({'msg':'Hello 1'}).limit(10)
- #sort排序
- db.deliver_status.find({'From':'ixigua@sina.com'}).sort({'Dt',-1})
- db.deliver_status.find().sort({'Ct':-1}).limit(1)
- #count操作
- db.user_addr.count()
- #distinct操作
- db.foo.distinct('msg')
- #>操作
- db.foo.find({"timestamp": {"$gte" : 2}})
- #子对象的查找
- db.foo.find({'address.city':'beijing'})
- 管理:
- #查看collection数据的大小
- db.deliver_status.dataSize()
- #查看colleciont状态
- db.deliver_status.stats()
- #查询所有索引的大小
- db.deliver_status.totalIndexSize()
- #查看当前所使用的数据库
- db