04-mongodb进阶

一、索引

索引作用类型:
    1:单列索引
    2:多列索引
    3:子文档索引
​
索引性质:
    0:普通索引
    1.唯一索引
    2.稀疏索引
    3.哈希索引

1.1 普通索引

语法: db.collections.ensureIndex({field:1});
​
注:
1:默认是增序建索引
2:默认索引是用btree组织
​
例: db.goods.ensureIndex({goods_id:1});
解释:
 1. 按goods_id增序规律建立索引
 2. 用btree组织索引文件
​
db.collections.ensureIndex({filed1:1,field2:-1})
说明: 1代表asc升续索引,-1降序
​
例:
    db.goods.ensureIndex({cat_id:1,goods_id:-1});
​

1.2 子文档索引

db.collection.ensureIndex({'fleld.subfiled':1});
说明: 为collection中文档的filed域下的subfiled域建索引
​
例:
db.user.insert({userid:1,email:'aa@a.com',intro:{height:175,age:24}}
​
db.user.ensoueIndex({'intro.height':1,'intro.age':1});
说明:此例为user表下的intro字段中的height,age字段建索引

1.3 多列索引

db.collection.ensureIndex({field:1/-1},{unique:true});
说明: 
1:field列上设置唯一索引
2:也可以针对"多列"设置唯一索引
​
例:
db.user.ensureIndex({userid:1},{unique:true});
db.user.ensureIndex({a:1,b:1},{unique:true});
​

1.4 稀疏索引

db.collection.ensureIndex({field:1/-1},{sparse:true});
说明:稀疏索引是指--只针对含有field列的document建索引
而不指定此项,则不含field列的文档,把field的值理解为null,再建索引
​
例:
db.user.ensureIndex({school:1},{sparse:true});
db.user.find({school:null});
​

1.5 哈希索引

db.collection.ensureIndex({field:'hashed'});
说明:
1. 可以单个字段或子文本字段上建立hash索引
2. 不可以针对"多个列"建立hash索引
​
例: db.collection.ensureIndex('intro.height':'hashed');
​

1.6 查看索引

db.collection.getIndexes();
例: 
> db.user.getIndexes();
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "ns" : "test.user",
                "name" : "_id_"
        },
        {
                "v" : 1,
                "key" : {
                        "intro.height" : "hashed"
                },
                "ns" : "test.user",
                "name" : "intro.height_hashed"
        }
]
​

1.7 删除索引

删除指定索引:
db.collections.dropIndex({filed:1/-1/'hashed'});
​
例:
db.user.dropIndex({'intro.height':'hashed'});
​
删除所有索引:
db.collection.dropIndexes();
注:_id列的索引不会被删除
​

1.8 重建索引

语法: db.collection.reIndex()
作用: 重建collection中的所有索引,包括_id
意义: 减少索引文件碎片
​
示例: db.user.reIndex()

二、副本集replication set

副本集: 是一组保持着相同数据集合的mongod实例. 其中1个mongod为primary,接收全部写操作 其余secodary只负责读操作

primary instance打开oplog,  secendary读取oplog,并产生相同的数据集

2.1 结构图

 

2.2 副本集与仲裁

 

2.3 分片

分片是指把数据分布存储在多台机器上,从而达到存储超大数据,及提高数据吞吐量的目的注:replication中,每台机器存储的内容是一致的,而sharding中,每台机器存储数据的一部分

 

2.4 分片结构图

1、mongs,请求路由

2、config server,存储元数据--即某台数据存储于某个sharding

3、shard--mongod实例或repla set

 

2.5 分片+复制集配置

1、依次启动副本节点
2、添加副本节点到集群
3、添加仲裁节点到集群
​
4、启动分片配置服务器     mongod --configsvr --dbpath <path> --port <port>
5、启动mongos路由器       
mongos --configdb <config server hostnames>
mongos --configdb cfg0.example.net:27019,cfg1.example.net:27019,cfg2.example.net:27019
6、连接路由器
mongo --host <hostname of mongos> --port 
mongo --host mongos0.example.net --port 27017
7、添加片节点
    sh.addShard( "rs1/mongodb0.example.net:27017" )
    sh.addShard( "mongodb0.example.net:27017" )
8、拆分database
    sh.enableSharding("database")
    db.runCommand( { enableSharding: database } )
9、拆分collection
    sh.shardCollection("<database>.<collection>", shard-key-pattern)
    sh.shardCollection("records.people", { "zipcode": 1, "name": 1 } )
    db.alerts.ensureIndex( { _id : "hashed" } )
    sh.shardCollection("events.alerts", { "_id": "hashed" } )
​

三、用户与权限

db.addUser();
{user:'xx',pwd:'yy',roles:['readWrite']}
一般用户可以简化为:
db.addUser(user,pwd,isReadOnly);
​
roles有:
read,readWrite,dbAdmin,userAdmin,clusterAdmin
readAnyDatabase,readWriteAnyDatabase
userAdminAnyDatabase,dbAdminAnyDatabase
​
db.removeUser(userName);
​
db.changeUserPassword(userName,newPwd);
db.auth(user,pwd);
​

四、聚合与map reduce

分组统计: group()

简单聚合: aggregate()

强大统计: mapReduce()

db.collection.group(document)
{
    key:{key1:1,key2:1},
    cond:{},
    reduce: function(curr,result) {
    },
    initial:{},
    finalize:function() {
    }
}
解释如下:
    key: 分组字段
    cond:查询条件
    reduce:聚合函数
    initial:初始化
    finalize:统计一组后的回调函数
​
1、计算每个栏目下的商品数 count()操作
{
    key:{cat_id:1},
    cond:{},
    reduce: function(curr,result) {
        result.total += 1;
    },
    initial:{total:0}
}
​
2、查询每个栏目下价格大于50元的商品个数
{
    key:{cat_id:1},
    cond:{},
    reduce: function(curr,result) {
        result.total += 1;
    },
    initial:{total:0}
}
​
3、计算每个栏目下的商品库存量 sum()操作
{
    key:{cat_id:1},
    cond:{},
    reduce: function(curr,result) {
        result.total += curr.goods_number;
    },
    initial:{total:0}
}
​
4、计算每个栏目下最贵的商品价格 max()操作
{
    key:{cat_id:1}, 
    cond:{}, 
    reduce: function(curr,result) {
        if(result.max<curr.shop_price) {
          result.max=curr.shop_price;
         }
    },
    initial:{max:0}
}
​
注意: 
1:group需要我们手写聚合函数的业务逻辑
2:group 不支持shard cluster, 无法分布式运算
3:分布式可以用 aggregate() (version2.2) , 或者mapReduce() (version2.4)
​
5、  select count(*) from goods group by cat_id;
​
    db.goods.aggregate({$group:{_id:"$cat_id",total:{$sum:1}}})
​

WHERE$match
GROUP BY$group
HAVING$match
SELECT$project
ORDER BY$sort
LIMIT$limit
SUM()$sum
COUNT()$sum
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

步道师就是我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值