前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mongodb拾遗

mongodb拾遗

作者头像
尚浩宇
发布2018-08-17 10:31:43
5130
发布2018-08-17 10:31:43
举报
文章被收录于专栏:杂烩

查询选择器(默认前缀为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  推荐

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015/11/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档