一、索引
索引作用类型: 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 |