一、特点介绍(占用磁盘空间大):
mongodb是文档型数据库,存储的是文档(Bson->json的二进制化),特点:内部执行引擎为js解释器,把文档存储成bson结构,查询时转换为js对象并通过熟悉的js语法来操作。
二、mongodb的下载安装
a) 下载地址:https://www.mongodb.com/try/download/community
b) 下载: wget https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-4.2.8.tgz
c) 解压: tar -zxvf mongodb-macos-x86_64-4.2.8.tgz
d) 移动:mv mongodb-macos-x86_64-4.2.8 /usr/local/mongodb
e) 切换到程序目录: cd /usr/local/mongodb
f) 建立目录:mkdir -p ./database ./log
g) 启动服务:sudo ./bin/mongod --dbpath ./database/ --logpath ./log/default.log --fork --port 27017
参数解释:
--dbpath:数据库存储目录
--logpath:日志存储目录
--port:运行端口(默认 27017)
--fork:后台进程运行
h) 连接mongo客户端: ./bin/mongo
三、mongo库表操作语句(user为表名)
a) 查看所有数据库:show dbs; show databases;
b) 选库(或创建库):use databaseName;
c) 查看表:show tables; show collections;
d) 查看操作命令:db.help();
e) 创建表:db.createCollection('user');
f) 新增一行:db.user.insert({name:'test',age:22});
g) 新增多行:db.user.insert( [{name:'test',age:22},{name:'xiali',age:2}] );
h) ID查表数据:db.user.find(‘id’);
i) 删除表:db.user.drop();
j) 删除数据库:db.dropDatabase();
k) 删除数据:db.user.remove(查询表达式,选项);
l) 替换文档:db.user.update({name:'tset'},{name:'daming'});
m) 更新:db.user.update({name:'test'},{$set:{name:'aliang'}},{multi:true});
i. $set:修改某列的值
ii. $unset:删除某一列
iii. $reset:重命名某一列
iv. $incr:自增某列的值
v. 选项{multi:true}可作用于多行,默认一行
vi. 选项{upsert:true}如果查询存在则更新,否则新增
vii. $setOnInsert:当upsert的时候,补充新增字段
n) 查表数据:db.user.find(查询表达式,查询列);
o) 关闭服务器:db.shutdownServer();
四、查询表达式
a) $ne不等于:db.user.find( {name:{$ne:'test'}} );
b) $gt 大于:db.user.find( {age:{$gt:1}} );
c) $lt 小于:db.user.find( {age:{$lt:1}} );
d) $gte 大于等于:db.user.find( {age:{$gte:1}} );
e) $lte 小于等于:db.user.find( {age:{$lte:1}} );
f) $nin 不在范围内:db.user.find( {age:{$nin:[1,9]}} );
g) $in 在范围内:db.user.find( {age:{$in:[1,9]}} )
h) $all 匹配所有:db.user.find( {age:{$all:[2,22]}} );
i) $or:db.user.find( {$or:[{name:{$ne:'test'}},{age:{$gt:5}}]} );
j) $and:db.user.find( {$and:[{name:{$ne:'test'}},{age:{$gt:5}}]} );
k) $not 取反:db.user.find( {age:{$not:{$gt:1}}} );
l) $nor 都不成功则为真:db.user.find({$nor:[{name:'test'},{age:{$gt:30}}]});
m) $exists 某列存在则为真:db.user.find( {age:{$exists:true}} );
n) $mod满足求余条件则为真:db.user.find( {age:{$mod:[3,2]}} ); //除3余2
o) $type数据为某类型则为真:db.user.find( {age:{$type:'number'}} );
p) $where 条件查询:db.user.find( {$where: 'this.age>2 && this.name == "test"' } ); //不建议使用,须把二进制数据转成js对象格式再查询,效率低
q) $regex 正则:db.user.find( {name:{$regex:/test/}} ); // 不建议使用,效率低
r) 查询遍历:db.user.find().forEach( function(obj){printjson(obj)} );
s) 分页查询:db.user.find().skip(2).limit(3);
t) 排序:db.user.find().sort( {name:1,age:-1} );
u) 统计: db.user.find().count();
五、索引
a) 查看查询分析:db.user.find().explain();
b) 查看当前索引:db.user.getIndexes();
c) 创建单列索引:db.user.ensureIndex({field:1/-1}); // 1为正序,-1为倒序
d) 创建多列索引:db.user.ensureIndex({field1:1/-1,field2:1/-1});
e) 创建子文档索引:db.user.ensureIndex({field.subfield:1/-1});
f) 创建唯一索引:db.user.ensureIndex({field.subfield:1/-1},{unique:true});
g) 删除索引:db.user.dropIndex({field:1/-1});
h) 删除所有索引:db.user.dropIndexes();
六、用户管理
a) 切换admin数据库:use admin;
b) 添加:db.createUser({user:'用户名',pwd:'密码',roles:[{role:'read',db:'admin'}]});
i. read:允许用户读取指定数据库
ii. readWrite:允许读写数据库
iii. dbAdmin:允许执行管理函数,如索引创建、删除,查看统计等
iv. userAdmin:允许创建、删除和管理用户
v. clusterAdmin:只在admin数据库可用,赋予用户所有分片和复制集中相关函数的管理权限。
vi. readAnyDatabase:只在admin数据库可用,赋予用户所有数据库的读权限。
vii. readWriteAnyDatabase:只在admin数据库可用,赋予用户所有数据库读写权限。
viii. root:只在admin数据库可用,超级账号,超级权限。
c) 删除:db.dropUser(用户名);
d) 更新密码:db.changeUserPassword("用户名","新密码");
e) 更新密码二:db.updateUser("用户名",{"pwd":"新密码"})
f) 更新角色::db.updateUser('用户名',{roles:[{role:'角色名称',db:'数据库名}]});
g) 用户验证:db.auth('用户名','密码');
七、mongodb备份和恢复
a) 导出:mongoexport -h host -p port -u username -p password
i. -d database:要导出的数据库
ii. -c collection:到导出的表
iii. -f field:要导出的列
iv. -q:查询条件(用引号包起来)
v. -o:导出文件名
vi. --csv:导出csv格式
b) 导入:mongoImport
i. -d database:待导入的数据库
ii. -c collection:待导入的表
iii. --type:文件类型,默认:csv|json
iv. --file:备份文件路径
c) 二进制导出:mongodump
i. -d database:库名
ii. -c collectino:表名
iii. -f fields: field1,field2...列名
d) 二进制导入:mongorestore
i. -d database:库名
ii. --directoryperdb 备份目录
八、replication复制集
a) 建立复制集目录: mkdir -p ./database0 ./database1 ./database2 ./log
b) 启动1服务(复制集 repl ):sudo ./bin/mongod --dbpath ./database0 --logpath ./log/default0.log --fork --port 27017 --replSet repl --smallfiles
c) 启动2服务(复制集 repl ):sudo ./bin/mongod --dbpath ./database1 --logpath ./log/default1.log --fork --port 27018 --replSet repl --smallfiles
d) 启动3服务(复制集 repl ):sudo ./bin/mongod --dbpath ./database2 --logpath ./log/default2.log --fork --port 27019 --replSet repl --smallfiles
e) 声明配置变量:
var rsconf = {
_id: 'repl',
members:[
{
_id:0,
host: '127.0.0.1:27017'
},
{
_id:1,
host: '127.0.0.1:27018'
},
{
_id:2,
host: '127.0.0.1:27019'
}]
}
f) 根据配置初始化:rs.initiate(rsconf);
g) 查看状态:rs.status();
h) 添加节点:rs.add('127.0.0.1:27019');
i) 删除节点:rs.remove('127.0.0.1:27019');
j) 允许slave读写:re.slaveok(); // 默认不许读写;
九、shard分片
十、聚集运算
a) 分组统计(不支持shard,cluster):db.collection.group({
key: {key1:1,key2:2},
cond:{},
reduce:function(curr,result){
result.total+= 1;
},
initial:{total:0},
finalize:function(){}
})
i. key:分组字段
ii. cond:查询条件
iii. reduce:聚合函数(迭代)
iv. initial:初始化参数值
v. finalize:统一一组后的回调函数
vi. curr:检索当前行数据
vii. result:统计结果
b) 简单聚合:db.collection.aggregate()
c) 强大统计:db.collection.mapReduce(
<map>, // 回调映射函数,为迭代函数传参
<reduce>, // 回调迭代函数,统计运算
{
out: <collection>,
query: <document>,
sort: <document>,
limit: <number>,
finalize: <function>,
scope: <document>,
jsMode: <boolean>,
verbose: <boolean>,
bypassDocumentValidation: <boolean>
}
)
i. map函数:
1. 作用:用于分组
2. 函数:function map(){ emit(param1, param2); }
3. 参数说明:
param1:需要分组的字段,this.字段名
param2:需要进行统计的字段,this.字段名
ii. reduce函数:
1. 作用:处理需要统计的字段
2. 函数:function reduce(key, values){
// 统计字段处理 return Array.sum(values);
}
3. 参数说明:
key: 指分组字段(emit的param1)对应的值
values:指需要统计的字段(emit的param2)值组成的数组
iii. option部分:
1. out:将统计结果存放到集合中 (不指定则使用临时集合,在客户端断开后自动删除)
2. query:一个筛选条件,只有满足条件的文档才会调用map函数(query,limit,sort可以随意组合)
3. sort:和limit结合的sort排序参数(也是在发往map函数前给文档排序),可以优化分组机制
4. limit:发往map函数的文档数量的上限(要是没有limit,单独使用sort的用处不大);