mongodb学习笔记

mongoDB介绍篇

mongodb由C++写就,其名字来自humongous这个单词的中间部分。最简洁描述为:scalable, high-performance, open source, schema-free, document-oriented database
 
mongoDB是一个基于分布式文件存储的数据库开源项目,旨在为WEB应用提供可护展的高性能数据存储解决方案。Mongodb由专门的公司来开发,公司名叫做10gen,2009年发行了以一个release版本。
 
跟mysqld一样,一个mongod服务可以有建立多个数据库,每个数据库可以有多张表,这里的表名叫集合(collection),每个collection 可以存放多个文档(document),每个文档都以BSON(binary json)的形式存放于硬盘中。
 
跟关系型数据库不一样的地方是,它是的以单文档为单位存储的,你可以任意给一个或一批文档新增或删除字段,而不会对其它文档造成影响,这就是所谓的schema-free,这也是文档型数据库最主要的优点,mongodb中稳定以json形式存在,默认的convention是一个collection中的稳定schema相同。所以别问我如何用mongodb做join,这种白痴问题。
 
跟一般的key-value数据库不一样的是,它的value中存储了结构信息,所以你又可以像关系型数据库那样对某些域进行读写、统计等操作。可以说是兼备了key-value数据库的方便高效与关系型数据库的强大功能。
 
Mongodb不是为事务准备的,只保证最终一致性,ACID的特性只有在RDBMS才具备,所以如果你要是要事务型的解决方案,mongodb并不适合。
 
Mongodb有很多特性,包括
高性能
丰富的查询语句,js like
Mapreduce
二级索引
地理位置索引
Replica-sets,就是集群服务,有一个primary,多个nodes,自动做failover
Auto-sharding
丰富的平台、驱动支持
 
Mongdb是典型的fire-and-forget模型,为的是高吞吐量(高rps,可以到达10w reads/writes per sec),当然也可以采用safe-mode,等mongo-server确认(为rps做一个tradeoff,5w reads/writes per sec)。这些预估的rps是可能因为你的RAM,CPU,磁盘IO,客户端驱动/APP而有差异的。默认的更新都是在内存里的,所以速度很快,每隔一段时间fsync内存数据到磁盘上。
 
Mongodb与传统RDBMS数据库的优势与不足:
优势:为web而生,缓存出色,高性能,高可用性
不足:非事务,ad-hoc BI/data warehouse场景不适用,不能取代复杂的sql查询
 
这里特别说明下,mongodb不是万能的,也只是应用于一些场景的NoSQL数据库,它的目标不是取代RDBMS关系型数据库,所以Use the right tool for each task。
 
 更多的mongodb介绍,NoSQL Fan网站上有个很全的list可以参考。
 

mongoDB安装篇

 
1、下载可执行文件
mongdb不用安装,去官网(http://www.mongodb.org/)根据平台下载bin即可。
 
2、修改$PATH,并使其生效
vim ~/.bash_profile
增加如下两行
export MONGO_HOME=/home/work/mongodb
export PATH=$MONGO_HOME/bin:$PATH
source该文件使其生效
source ~/.bash_profile
 
mongoDB安装完毕,then enjoy it!
 
 

mongoDB 实战篇

1、开启mongoDB服务
 
运行mongDB可用如下命令:
./mongod –port 8017 –dbpath /home/work/mongodb/data –logappend –logpath /home/work/mongodb/log/log.8017 &
参数含义:
port: 可启动时指定服务端口,而无需在配置文件里设置
dbpath: mongDB数据文件的路径
logpath: 打印日志路径
 
可以用安装的一个mongoDB在不同端口上启动另一服务,如运行如下命令
./mongod –port 8019 –dbpath /home/work/mongodb/data1 –logappend –logpath /home/work/mongodb/log/log.8019 &
 
后台不同端口上的两个mongoDB都在运行
 
 
2、登陆mongoDB,运行简单命令
 
登陆mongoDB:mongo 127.0.0.1:8017
 
列出当前数据库:show dbs
 
定义新的数据库名:use beidou
使用“use new-databasename”的语法去使用一个新的数据库,注意,即使你的数据库还没建立起来,依然可以这样使用,因为mongodb会在真正插入了数据后,才会真正建立起来
 
定义一个collection,名为“users”,然后插入数据
db.users.save( {username:"neoremind"} )
db.users.find()
mongoDB插入数据就自动建数据库、collections,可以不用像SQL数据库那样有建表的脚本。
 
也可以只创建Collection
db.createCollection("collecName")
 
向mongoDB数据库databaseName的collectionName灌数据,field有两个字段,分别为id和key,输入文件为data.dat
mongoimport –ignoreBlanks -h127.0.0.1 –port 8017 –ddatabaseName -ccollectionName -f"id,key" –type "tsv" –file data.dat
 
从mongoDB导出数据
mongoexport -h127.0.0.1 –port 8017 –ddatabaseName -ccollectionName -f"id,key" –csv > mongo.out
 
 
3、正确关闭mongoDB
 
第一种:官方文档说明要使用 kill -15,killall mongod或者在client的shell里,use admin,执行db.shutdownServer()即可。
 
第二种:通过replication 使用 一个slave,或者用replica set 来避免单结点数据丢失。
 
第三种:在 MongoDB 1.7 版本的最新分支上,就出现了一个新的数据可靠性选项(–dur)的支持。并且在数据文件修复工具上也有了一些改进。如果在启动MongoDB时加上–dur 则MongoDB 会在进行写操作前记一份日志,这和在其他一些数据库中的binlog 类似,在MongoDB 数据文件损坏的情况下,可以使用此日志来进行恢复。据说其对性能的影响不大。
 
 

mongoDB 其它常用操作篇

常用数据库操作
1. 查看帮助
help
 
2. show database names
show dbs  
                   
3. show collections in current database
show collections   
          
4. show users in current database
show users   
                
5. 切换/创建数据库
use yourDB;  
 
6. 删除当前使用数据库
db.dropDatabase();
 
7. 查看当前使用的数据库
db 或者 db.getName();
 
8. 显示当前db状态
db.stats();
 
9. 当前db版本
db.version();
 
10. 查看当前db的链接机器地址
db.getMongo();
 
常用集合操作
1. 创建一个聚集集合
db.createCollection("apilog"});
 
2. 查询当前集合的数据条数  
db.apilog.count();
 
3. 查看数据空间大小 
db.apilog.dataSize();  //单位为KB
 
4. 得到当前聚集集合所在的db 
db.apilog.getDB();
 
5. 得到当前聚集的状态 
db.apilog.stats();
 
6. 得到聚集集合总大小 
db.apilog.totalSize(); 
 
7. 聚集集合储存空间大小 
db.apilog.storageSize();
 
8. 删除当前聚集集合 db.apilog.drop();
 
 
常用查询操作
MongoDB
关系型数据库(Mysql)
 
db.test.find({‘name’:’foobar’})
select * from test where name=’foobar’
 
db.test.find()
select * from test
 
db.test.find({‘ID’:10}).count()
select count(*) from test where ID=10
 
db.test.find().skip(10).limit(20)
select * from test limit 10,20
 
db.test.find({‘ID’:{$in:[25,35,45]}})
select * from test where ID in (25,35,45)
 
db.test.find().sort({‘ID’:-1})
select * from test order by ID desc
 
db.test.distinct(‘name’,{‘ID’:{$lt:20}})
select distinct(name) from test where ID<20
 
db.test.group({key:{‘name’:true},
cond:{‘name’:’foo’},
reduce:function(obj,prev)
{prev.msum+=obj.marks;
},
initial:{msum:0}}) select name,sum(marks) from test group by name
 
db.test.find(‘this.ID<20’,{name:1})
select name from test where ID<20
 
db.test.insert({‘name’:’foobar’,’age’:25})
insert into test (‘name’,’age’) values(‘foobar’,25)
 
db.test.remove({})
delete * from test
 
db.test.remove({‘age’:20})
delete * from test where age=20
 
db.test.remove({‘age’:{$lt:20}})
delete * from test where age<20
 
db.test.remove({‘age’:{$lte:20}})
delete * from test where age<=20
 
db.test.remove({‘age’:{$ne:20}})
delete * from test where age!=20
 
db.test.update({‘name’:’foobar’},{$set:{‘age’:36}})
update test set age=36 where name=’foobar’
 
db.test.update({‘name’:’foobar’},{$inc:{‘age’:3}})
update test set age=age+3 where name=’foobar’
 
 
索引
1. 创建索引
db.userInfo.ensureIndex({name: 1});
db.userInfo.ensureIndex({name: 1, ts: -1});
 
2. 查询当前聚集集合所有索引
db.userInfo.getIndexes();
 
3. 查看总索引记录大小
db.userInfo.totalIndexSize();
 
4. 读取当前集合的所有index信息
db.users.reIndex();
 
5.删除指定索引
db.users.dropIndex("name_1");
 
6. 删除所有索引索引
db.users.dropIndexes();
 
 

Leave a Comment.