王志广的个人分享

mongo学习

admin发表于2015-08-12  5,096次浏览 标签: 

mongodb是什么?
mongodb是文档型数据库,存储的是文档(Bson结构(json的二进制化)),内部执行引擎为JS解释器(趋势转化为V8引擎),把文档存储成bson结构,在查询时,转换为JS对象,并可以通过熟悉的js语法来操作。
mongodb和传统型数据库相比,最大的不同是mongodb表下每行文档都可以有自己的独特的结构。

 

mongo怎么用?
(1)开启服务
mongodb文件解释
bsondump 导出bson结构
mongo 客户端
mongod 服务器
mongodump 整体数据库导出
mongoexport 导出易识别的json文档或csv文档
mongorestort数据库整体导入
mongos shard分片时使用
mongotop 性能检测工具
mongostats 状态

mongod –dbpath /path/to/database –logpath /path/to/log –fork –port 27017
–dbpath 数据存储目录
–logpath 日志存储目录
–port 运行端口(默认27017)
–fork 后台进程运行
–auth 需要认证

 

(2)CURD
库表操作(mongo可以通过直接使用创建)
show dbs 查看当前的数据库
use databaseName 选库
show tables/collections 查看当前库下的collection
db.createCollection(collectionName) 创建表
db.collectionName.drop() 删除表
db.dropDatabase() 删除库
CURD表操作

插入:
db.collectionName.isnert(document) 插入可以插入多个[{‘abc’:”abc”},{‘cba’:”cba”}]
删除:
db.collection.remove(查询表达式, 选项);
选项是指 {justOne:true/false},是否只删一行, 默认为false

修改:
db.collection.update(查询表达式,新值,选项)
选项是指{upsert:true/false,multi:true/false}没有匹配的行,是否直接插入该行,{multi:true}是指修改多行还是一行,默认也只改1行
新值表示如下
{abc:’abc’} 是说把改行改为
{$set:{abc:’abc’}}是把改行的改个元素改为
$set 修改某列的值
$unset 删除某个列
$rename 重命名某个列
$inc 增长某个列
$setOnInsert 当upsert为true时,并且发生了insert操作时,可以补充的字段

查找:find, findOne
db.collection.find(查询表达式,查询的列)
列如db.abc.find({},{abc:1,_id:0}) _id不显示,abc显示
find().count()统计个数
skip(), limit() 跳过

查询表达式
{filed:value}是指查询field列的值为value的文档
$nq {field:{$nq:value}} filed列的值不等于value的文档
$nin {field:{$nin:[v1,v2..]}} 不包含
$all {field:{$all:[v1,v2..]}} 包含
$exists {field:{$exists:1}} 查询出含有field字段的文档
$and {$and:[条件1,条件2]}
$or {$or:[条件1,条件2]}
$nor {$nor:[条件1,条件2]} 是指所有条件都不满足的文档为真返回
正则 db.abc.find({abc:/abc.*/}); like操作
$where {$where:’this.a != a && this.b != b’}$where查询时, mongodb是把bson结构的二进制数据转换为json结构的对象,然后比较对象的属性是否满足表达式

游标
var Cursor = db.collectioName.find();
Cursor.hasNext() ,判断游标是否已经取到尽头
Cursor. Next() , 取出游标的下1个单元

 

(3)索引
db.find(query).explain();分析语句
db.collection.getIndexes() 查看当前索引状态
db.collection.ensureIndex({field:1/-1},规则) 创建普通的单列索引
db.collection.ensureIndex({field1:1/-1,field2:1/-1},规则) 创建多列索引
db.collection.ensureIndex({filed.subfield:1/-1},规则) 创建子文档索引
规则
{unique:true} 唯一索引
{sparse:true} 稀疏索引 不含field列的文档,将不建立索引,普通索引,会把该文档的field列的值认为NULL,并建索引
db.collection.ensureIndex({file:’hashed’});创建哈希索引
db.collection.reIndex()重建索引减少碎片
db.collection.dropIndex({filed:1/-1}) 删除单个索引
db.collection.dropIndexes() 删除所有索引

 

(4)聚集运算
1.group
{
key:{cat_id:1}, 对那个列聚集
cond:{}, 条件
reduce:function(curr , result){ 表示含义
result.cnt += 1;
result.sum += curr.shop_price;
},
initial:{sum:0,cnt:0},显示列
finalize:function(result){//每个组运行完后执行的方法
result.avg = result.sum/result.cnt;
}
}

2.aggregate
$sum求和 $avg求平均值
[
{$match:{abc:{$gte:3}}},条件
{$group:{_id:”$cat_id” , total:{$sum:”$goods_number”}}},聚合规则
{$sort:{total:1}},排序
{$limit:3} 限制
]

3.mapReduce
mapReduce求平均
map声明
var map = function(){
emit(this.id,this.abc);
}
reduce声明
var reduce = function(id,values){
return Array.avg(values);
}
db.goods.mapReduce(map,reduce,{out:’res’});

 

(5)用户管理
use admin 进入超级用户管理
db.addUser(用户名,密码,是否只读) 添加用户
db.auth(用户名,密码) 认证用户
db.changeUserPassword(用户名, 新密码) 修改密码
db.removeUser(用户名) 删除用户

 

(6)备份与恢复

导出 mongoexport -d 库名 -c 表名 -f field1,field2…列名 -q 查询条件 -o 导出的文件名 — csv 导出csv格式 默认json
导入 mongoimport -d 待导入的数据库 -c 待导入的表(不存在会自己创建) –type csv/json(默认) –file 备份文件路径
导出二进制bson结构的数据及其索引信息 mongodump -d 库名 -c 表名 -f field1,field2…列名
导入二进制文件 mongorestore -d 库名 –directoryperdb 备份目录

 

(7)replication复制集和shard分片

replication复制集
配置配置
rsconf = {_id:’rsa’,members:[{_id:0,host:’ip:端口’}]}
rs.initiate(rsconf) 根据配置做初始化
rs.add(‘ip:端口’) 添加节点
rs.status() 查看状态
rs.remove(‘192.168.1.201:27019’) 删除节点
当从服务器不允许读写时需要 rs.slaveOk();

shard分片
mongos –port 30000 –dbconfig ip:端口,ip:端口 开启
操作需要连接后mongo –port 30000
sh.addShard(‘ip:端口’) 添加
sh.enableSharding(databaseName) 添加待分片的库
sh.shardCollection(‘dbName.collectionName’,{field:1}) 添加待分片的表
mongodb的分片分布式是chunk块分 默认chunksize=64,在config修改,而且chunk也会来回移动
手动预先分片,例如规定一个id放在的位置
sh.shardCollection(“库.表”,{列:1})
for(var i=1;i<=40;i++) { sh.splitAt(‘库.表’,{列:i*1000}) }

 

(8)php-mongo
//MongoDB有用户名密码并指定数据库blog
$conn = new Mongo(“mongodb://${username}:${password}@localhost/blog”);
$collection= $conn->selectDB(‘blog’)->selectCollection(‘users’);

你可以发表评论引用到你的网站或博客,或通过RSS 2.0订阅这个日志的所有评论。
上一篇:
下一篇:
没有评论
我来说两句

  Ctrl+Enter