mongo是用c++编写的开源跨平台分布式非关系文档数据库,其可存储海量数据,主要用于查询操作。非关系nosql数据库主要有四大类,键值型数据库,如memcachedb、redis;列数据库,如hbase;文档型数据库,如mongo;图形数据库。通常在数据量很大,且需要不断扩容;要求读写速度非常快;需求会经常变更,导致数据模型无法确定;系统要求相当高的可用性的情况下会考虑使用mongo。
mongod.conf文件用于设置mongo服务启动时的配置信息。
port:指定服务端口,默认27017。
dbpath:指定数据库文件存放目录,必须先创建目录,如/…/mongo/db。
logpath:指定数据库日志文件存放目录与文件名,必须先创建目录和文件,如/…/mongo/mongod_27017.log。
fork:指定服务是否为后台运行,默认非后台运行。
bind_ip:绑定服务实例只接受来自指定ip的请求,默认可接收任意ip的请求。
auth:指定服务是否以认证的方式启动,前提是必须在admin数据库中创建超级用户,默认不认证。
journal:开启日志功能,默认开启。
logappend:错误日志采用追加模式,默认为覆盖。
=======================================
// 解压安装包到当前目录
tar xzf xxx.tgz
// 在etc/rc.local文件内添加如下字符串,使mongo服务随着linux的启动而开机自启
/安装目录/mongo-x.x.x/bin/mongod --config ../mongo_27017.conf
// 在解压目录下执行,启动服务
bin/mongod --config mongod_27017.conf
// 启动客户端连接服务,为自带的javascript shell命令接口,可使用可视化的客户端工具,如sqlyog
bin/mongo
// 进入admin数据库
use admin
// 发送消息关闭与其连接的服务
db.shutdownServer()
=======================================
文档为核心,等同于关系数据库中的记录,数据结构类似json格式,由一对大括号以及之间的多个键值对构成。键不可重复,必须是字符串,在双引号之间,不能有空字符\0
,不能用.或$
,不能以_
开头。值可以是任意类型,严格区分类型与大小写,且键值有序。
集合由多个文档构成,等同于关系数据库的表,无固定模式,可存放任意格式文档。业务上使用集合来管理文档,结构更加清晰,且实际中通常同一个集合中存放相同模式的文档。集合的命名使用字符串,不能有空串,不能有\0空字符,不能以system开头,不能有$字符,可以使用类似java的包名,用点间隔。
数据库由多个集合构成,一个服务实例可有多个相互完全独立的数据库,每个数据库都对应硬盘上一个不同的文件。数据库的命名使用字符串,要求同上,全部用小写。数据库对应硬盘的文件,其名字也最终会转为硬盘上的文件名,由此命名时应该注意兼容系统。
=======================================
操作mongo前必须先进入某个数据库,然后在该库下执行命令,默认在test库下,初始所有数据库为空。若要以认证auth=true的方式启动服务,必须要在数据库中创建用户,才能使认证功能生效。
// 创建超级用户
// 先将mongod.conf中auth=true注释掉,以非认证的方式启动服务
// 切换到admin数据库
use admin
// 用户的信息位于其被指定的数据库的system.users集合中,创建超级用户
db.createUser (
{
// 用户名
user: "lt",
// 用户密码
pwd: "123",
// 用户描述信息,可有可无
customData: {any info}
// 为用户分配角色,值为数组[],数组中一对{}就是一个角色,一个用户可分配多个角色
// 角色有内置的,也有自定义的,db指定该用户的该角色对哪个数据库起效
roles: [{role: "root", db: "admin"}, {....}, ....]
}
)
// 内置角色
// 数据库操作角色
// 允许用户读取指定的数据库
read
// 允许用户读写指定的数据库
readWrite
// 数据库管理角色
// 允许用户对指定的数据库进行管理操作
doAdmin
// 允许用户对指定数据库的system.users集合进行操作
userAdmin
// 仅适用于admin数据库的角色
// 允许用户对服务中的所有数据库进行读操作
readAnyDatabase
// 允许用户对服务中的所有数据库进行读写操作
readWriteAnyDatabase
// 赋予用户对服务中所有数据库的userAdmin权限
userAdminAnyDatabase
// 赋予用户对服务中所有数据库的dbAdmin权限
dbAdminAnyDatabase
// 超级用户
root
// 创建其它用户
// 输出当前的所有进程,并查找mongod关键字
ps -ef | grep mongod
// 查找出服务进程id后,杀死进程
kill -2 pid
// 将mongod.conf中对auth=true的注释取消,以认证的方式启动服务
// 切换到admin数据库
use admin
// 使用超级用户认证登录
db.auth("lt", "123")
// 切换到test数据库
use test
// 为test数据库创建一个读写用户
db.createUser (
{
user: "test-lt",
pwd: "123",
roles: [{role: "readWrite", db: "test"}]
}
)
// 使用刚创建的账号认证登录
db.auth("test-lt", "123")
=======================================
mongo自带客户端访问其服务,该工具内置javascript解释器,可解释运行脚本语句和函数,其提供的全局变量db对象封装了对数据库操作的各种函数。
// 查看当前服务中的所有数据库
show dbs
// 切换到指定数据库,默认连接到test数据库
// 若数据库不存在,则创建数据库,并切换到该数据库
// 连接到数据库后,连接对象会被赋值给db,之后通过db的函数来操作数据库
use dbname
// 查看服务实例所在服务器的ip地址
db.getMongo()
// 查看当前数据库,直接db也可以
db.getName()
// 查看当前数据库状态
db.stats()
//查 看当前mongo服务的版本
db.version()
// 查看当前数据库中的所有集合
show collections
// 删除当前数据库中的xx集合,将当前数据库中的全部集合删除就等同于删除数据库
db.xx.drop()
// 插入
// 创建文档doc,并初始化,key会自动加双引号,文档创建后必须插入集合才会生效
doc={name: "lt", pwd: "123", sex: "man", age: 29}
// 将文档doc插入集合user,若集合user不存在,自动创建
// 系统自动为新插入集合的文档添加key为_id的键值对,用于唯一标识该文档
db.user.insert(doc)
// 先遍历集合,查看文档doc是否存在,若存在执行更新,不存在执行插入
db.user.save(doc)
// 用js脚本一次插入多个文档
for(var i = 0; i < 10; i++) {
var doc = {name: "lt" + i, pwd: i, sex: "man", age: 29 + i};
db.user.insert(doc);
}
// 修改
// 将user集合内name为lt的文档的对应键值改为ltnew
db.user.update({name: "lt"}, {$set, {name: "ltnew"}});
// 删除
// 将user集合内name为ltnew的文档删除
db.user.remove({name: "ltnew"});
// 删除集合内所有文档
db.user.remove({});
// 查询
// 查看集合内的所有文档,一次最多只显示20个,输入it,可显示下一页的数据
db.user.find()
// 直接遍历,一次性显示所有的文档
db.user.find().forEach(printjson);
// 按条件查询,返回name为xx的文档
db.user.find({name: "xx"}).forEach(printjson);
// 按条件查询,返回name为xx的文档,{name: 1}表示仅返回name字段,{name: 0}表示返回除name意外的全部字段
db.user.find({name: "xx"}, {name: 1}).forEach(printjson);
// 返回所有文档,但仅返回name字段
db.user.find({}, {name: 1}).forEach(printjson);
// 仅返回符合条件的第一条数据
printjson(db.user.findOne({条件}));
// 仅返回符合条件的前3条数据
db.user.find({条件}).limit(3);
// 用js脚本来查看数据,用游标操作
var cursor = db.user.find();
while(cursor.hasNext()) {
printjson(cursor.next());
}
// 用数组操作
var cursor = db.user.find().toArray();
for(var i = 0; i < cursor.length(); i++) {
printjson(cursor[i]);
}