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 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Python如何防止sql注入

豌豆贴心提醒,本文阅读时间10分钟 前言 web漏洞之首莫过于sql了,不管使用哪种语言进行web后端开发,只要使用了关系型数据库,可能都会遇到sql注入攻...

5196
来自专栏ImportSource

并发编程-用锁来保护状态

由于锁机制可以让他保护起来的代码片段始终被串行访问。也就是一个访问完了,再由下一个来访问。我们可以利用锁的这种特点,来约定一些协议,来对共享的状态进行独占访问。...

3375
来自专栏用户2442861的专栏

linux select函数详解

http://blog.csdn.net/lingfengtengfei/article/details/12392449

1032
来自专栏小怪聊职场

爬虫课堂(十五)|Request和Response(请求和响应)

5626
来自专栏Jimoer

JVM学习记录-线程安全与锁优化(一)

线程:程序流执行的最小单元。线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件I...

752
来自专栏猿人谷

realloc invalid pointer错误解析

realloc invalid pointer错误 char* temp=(char*) realloc(src,sizeof(char)*100); 如上面这...

1985
来自专栏Java编程技术

一个有关定时生产与消费的问题

按照上面的逻辑看的话,每个队列里面最多有一个元素。其实不然,因为在多线程模型中每个线程占用cpu执行的时间是按照时间片来划分的,每个线程执行完自己的时间片后会被...

821
来自专栏大内老A

ASP.NET Core的配置(4):多样性的配置来源[上篇]

较之传统通过App.config和Web.config这两个XML文件承载的配置系统,ASP.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种...

2066
来自专栏Golang语言社区

Go性能优化小结

做过C/C++的同学可能知道,小对象在堆上频繁地申请释放,会造成内存碎片(有的叫空洞),导致分配大的对象时无法申请到连续的内存空间,一般建议是采用内存池。Go ...

2783
来自专栏扎心了老铁

python使用上下文管理器实现sqlite3事务机制

如题,本文记录如何使用python上下文管理器的方式管理sqlite3的句柄创建和释放以及事务机制。 1、python上下文管理(with) python上下文...

47212

扫码关注云+社区

领取腾讯云代金券