查询选择器(默认前缀为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 推荐 |
时间: 2024-10-24 01:08:42