专栏首页杂烩mongodb拾遗

mongodb拾遗

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • spring的spel 转

     Spring 3.0 创建了一种新的方式用以配置对象的注入(set注入或者构造参数注入),它便是SpEL (Spring Expression Languag...

    尚浩宇
  • SSM项目搭建之druid 原

    1) 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。 

    尚浩宇
  • springmvc http异步请求 原

        servlet3.0开始支持异步请求,springmvc3.2引入支持异步http。相比于servlet2.5,异步后的程序在系统性能,尤其是吞吐量,资...

    尚浩宇
  • 面试官问:MySQL的自增ID用完了,怎么办?

    可以发现 AUTO_INCREMENT 已经自动变成2,这离用完还有很远,我们可以算下最大当前声明的自增ID最大是多少,由于这里定义的是 intunsigned...

    用户4143945
  • 面试官问:MySQL的自增ID用完了,怎么办?

    可以发现 AUTO_INCREMENT 已经自动变成2,这离用完还有很远,我们可以算下最大当前声明的自增ID最大是多少,由于这里定义的是 intunsigned...

    xcbeyond
  • mybatis笔记整理mybatis的基本用法及配置:

    贪挽懒月
  • MYSQL数据库设计的一些小技巧[转载]

    常用数据操作语言DML笔记(select insert update delete) select 语句 高级的查询功能,见下面的详细内容 s...

    wangxl
  • java进阶|MyBatis系列文章(七)多表查询操作

    以上jar包依赖主要是mysql连接,支持mybatis操作以及简化get/set方法的lombok包。

    后端Coder
  • Vert.x!这是目前最快的 Java 框架

    如果您搜索“最佳网络框架”,您可能会偶然发现Techempower基准测试,其中排名超过300个框架,在那里你可能已经注意到Vert.x是排名最高的。

    Java技术栈
  • connect by超乎你想象

    SQL中的connect by主要用在层级关系的查询,乍看确实可能有些绕,但在某些场景下,确实方便,语法格式如下,

    bisal

扫码关注云+社区

领取腾讯云代金券