码迷,mamicode.com
首页 > 数据库 > 详细

mongodb拾遗

时间:2015-11-17 17:11:08      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:

查询选择器(默认前缀为db.test.)
语句 说明 备注
find() 查询全部数据 默认每200ms将数据flush到硬盘
find({id:1}) 精确查询
find({id:{$lt:5}) id小于5的全部数据 同样的还有$lte(小于等于)、$lt(小于)、$gt(大于)、$gte(大于等于)
find({id:[1,2]}) 某个范围内 $nin(不在某个范围内,低效,会使索引失效)、$ne(不等于,低效,会使索引失效
find({$or:[{id:1},{id:2}]} 等同sql or $and(等同于sql and,find({$and:[{id:1},{name:"xiaoming"}]}))
find({id:{$existis:false}}) 返回存在/不存在某个字段的全部数据
find({‘detail.1.post‘:5}) 返回属性detail的第二个元素中post为5的数据
find({id:1},{_id:0,id:1,name:1}) 查询id为1的数据并只返回id和name,0不现实,1显示
find({}).sort({id:-1}) 查询所有数据并按id降序,1升序 大数据量时排序字段必须建立索引
find({}).skip(1).limit(4).sort({id:-1}) 查询所有数据并按id降序,且跳过前1行开始返回4条数据 尽量不要使用skip,性能差
find({array:[1,2]}) 精确匹配数组array为[1,2]的数据 find({array:1}) 查找所有数组中包含1的数据
find({"array.0":1}) 查找所有数据第一个元素为1的数据
find({array:[1,2]},{_id:0,"status.info":1}) 精确匹配数组array为[1,2]的数据并返回status属性的info字段 映射字段同样可用数组方式find({array:[1,2]},{_id:0,"status.0.info":1})
find({},{array:{"$slice":-1},"array.desc":0}) 返回数组array的最后一个元素
索引及查询优化
ensureIndex({name:1},{unique:true}) 为字段name建立唯一索引(该字段值必须唯一)unique:false为普通索引 db.system.indexes.find()查看索引,
如果对数组建立索引,那么数组中的每个元素都会建立索引
find().explain() 解释查询语句
ensureIndex({name:1,age:1}) 为字段name和age建立复合索引
dropIndex("name") 删除name索引
db.setProfilingLevel(1) 开启数据库监视功能,0关闭,1记录慢查询。2记录所有,所有监视结果都在system.profile中
增删改操作
insert({id:1,name:"xiaoming",age:2}) 添加一条数据 集合不存在自动创建
如果不显示指定_id则自动创建
update({query,update,<upsert>,<multi> query:查询条件
update:更新内容
upsert:是否查不到数据就插入
multi:是否只匹配第一个找到的数据
update({id:1},{$set:{name:"zhangsan"},$inc:{age:12}})将集合中id为1的name改成zhangsan,age在原基础上增加12
update({id:1},{name:"zhangsan",age:12})将集合中id为1的name改成zhangsan,age改成12并清除其他字段(区别在于是否有操作符如$set)
remove(<query>,<justone>) 删除数据
无参时,删除全部数据,不删除索引(数据为物理删除)
只有query的时候删除所有匹配的数据
有justone的时候删除匹配的第一个文档
高级特性
管道聚集 $match 过滤文档只传递匹配的文档到管道中的下一个步骤
$limit  限制管道中文档的数量
$skip  跳过指定数量的文档,返回剩下的文档
$sort  对所有输入的文档进行排序
$group  对所有的文档进行分组然后计算聚集结果
$first 返回group操作后的第一个值
$last 返回group操作后的最后一个值
$max 返回group操作后的最大值
$min 返回group操作后的最小值
$avg 返回group操作后的平均值
$sum 回group操作后的所有值的和
$out  将管道中的文档输出到一个具体的集合中,这个必须是管道操作的最后一步
db.test.aggregate([
           {
            $match:{status:"normal"}
            },
            {
             $group:{_id:null,count:{$sum:1}}
            }
])
mapreduce聚集 db.test.mapreduce(
 //map
 function(){
  emit(this.id,this.age);
 },
 //reduce
 function(key,values){
  return Array.sum(values);
 },
 //query
 {
  query:{status:"normal"},
  outresult:"result"
 }
)
简单聚集 distinct("name") 去重
find().count() 统计
group 分组
sql:select _id,sum(value) count csum from coll where _id<3 group by _id
group(
 {
  key:{_id:1},
  cond:{_id:{$lt:3}},
  reduce:function(cur,result){
   result.count+=cur.value
  },
  initial:{count:0}
 }
)统计_id小于3,按照_id分组求value值的和
key:用来分组文档的字段。和keyf两者必须有一个
keyf:可以接受一个javascript函数。用来动态的确定分组文档的字段。和key两者必须有一个
initial:reduce中使用变量的初始化
reduce:执行的reduce函数。函数需要返回值。
cond:执行过滤的条件。
finallize:在reduce执行完成,结果集返回之前对结果集最终执行的函数。可选的
sql:select a,b,sum(c) csum from coll where active=1 group by a,b
db.coll.group(
           {key: { a:true, b:true },
            cond: { active:1 },
            reduce: function(obj,prev) { prev.csum += obj.c; },
            initial: { csum: 0 }
            });
group和distinct返回的结果集不能大于16mb,不能在分片集群上进行操作且group不能处理超过10000个唯一键值,超过这个限制只能使用管道或者mapreduce
复制集 三节点组成,一个主节点,一个从节点,一个哨兵节点,哨兵节点不存储任何数据,只负责管理和处理故障时发生的问题
分片 同redis分片,mysql分区。三台独立mongo,每个可做复制集。每台都有一个configure服务器,一台路由服务器
启动configure服务器
启动mongos路由服务器
启动分片服务器
使用sh.addshard添加分片到路由服务器
注:集合设置分片才能进行分片,且片键上必须有索引sh.enablesharding("test") 
当chunk不平衡时自动启动平衡器
所有客户端通过连接路由服务器来连接数据库
不包含索引和片键的查询会查询所有数据
只包含片键的会只查询片键归属的一个片上的所有数据
包含片键和索引的会查询片键归属的片并按索引高效查询
不能使用升序字段做片键
不推荐使用随机字段做片键
不推荐范围有限的字段做片键
片键应具有分发写操作、读操作不能太过随机化(尽量局部化)、要保证chunk一只能被分割的特性,故此片键通常需要有几个字段进行组合,如_id和city
文件系统 小于16mb的文件可直接转化成二进制存储
gridfs默认切割成每个256kb的小块
监控及管理
导入导出 mongoexport、mongoimport
备份恢复 mongodump、mongorestore 集群备份:禁用平衡器、停止每个片上的second节点和配置服务器、备份,重启复制集成员、重启平衡器
集群恢复:停止所有实例、恢复每个片中的数据、恢复配置服务器、重启所有实例、执行db.printshardingstatus()确保集群是可操作的
数据库监控 mongostat、mongotop、serverstatus、stats
web控制台监控 端口号28017,2.6以前默认启动,之后默认关闭,启动时加入参数httpinterfacetrue开启
权限 启动时加入auth=true
用户-角色(一对多)-权限(一对多)
可针对到库设置用户和权限
客户端 MongoVUE   免费不好用
Robomongo  推荐

mongodb拾遗

标签:

原文地址:http://my.oschina.net/shyloveliyi/blog/531565

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!