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]);
}