mongodb 系列~查询

一 背景介绍
mongodb是一款高效处理JSON数据的NOSQL数据库,最新版4.0+版本已然支持分布式事务,不过大多数公司的业务场景还是按照传统的做法,稳定与安全
二 版本选择
1 由于mongodb的版本迭代很快.最新版本已经4.0+,但是按照稳定性和可运维性,本文档采用的版本是3.4版本,采用不同版本可能会有相关改动,实际请参考官方文档
二 关于database
1 use db_name 有则切换 没有则创建  
Show dbs 查看所有database
新创建的数据库并不能通过show dbs直接查看,需要创建一个含有数据的collections
use db_name db.dropDatabase() 删除数据库
2 存在一些具有意义的数据库,所以不能创建重名,最基本的就是admin和local数据库,都有其作用
 三 关于collection
1 概念: mongodb中的collection就相当于mysql的table
2 collection 构成
1 每一行存储的json数据就相当于mysql的row
2 每一行json数据的每个key就相当于mysql的row-field,每个value就相当于mysql的row-data
3 每个collection内部也有相应的索引,作用在field上 作用就是加速查询
 四 关于collection的基本查询-语法(非聚合)
db.collection.find({query},{projection}).pretty()
pretty()为易于读取的方式
find()函数为核心的查询函数,我们可以理解为sql之中的select关键字,查询必定调用
query :可选,使用查询操作符指定查询条件 可以理解成为sql查询的where部分
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值可以理解成
针对mysql类似的拆解
select a from col where c=‘dd‘ order by c
select 为 部分1 指定find() where条件为部分2 指定成query select a为部分3 指定为projection order by c 为部分四,为find后的调用函数
sql查询的指定列返回值部分
五 query部分
说明:以下 字段名用column指定 条件判断值用 data代替 作用域关键字为 操作符
案例分别标注mysql和mongo的相关语法
六 比较操作符
语法符号: $gt 大于 $gte 大于等于 $lt小于 $lte小于等于
$ne 不等于 可以用来判断字符串的等值
语法标准: db.collection.find({column:{操作符:data,....}})
语法案例
mongo db.col.find({likes : {$lt :200, $gt : 100}})
mysql Select * from col where likes>100 AND likes<200;
七 等值
语法标准: db.collection.find({column:data,....})
语法案例
mongo db.col.find({likes:‘100‘,c:200})
mysql select * from col where likes=100 and c=200
八 集合
语法符号: $in在集合 $nin 不在集合
$all 满足所有集合 这里的意思是说只有满足集合内部所有条件情况下才会返回结果.而$in只需要满足一个即可
语法标准: db.collection.find({column:{操作符:[data1,data2,data2]}})
语法案例
mongo db.col.find({likes : {$in :[100,200,300]}})
mysql Select * from col where likes in( 100,200,300);
九 与和或
语法符号:$and 和关系 $or 或关系
语法标准: db.collection.find({操作符:[{},{},{}]}) {}内部为and需要连接的条件 or同理,可以简单理解为 将需要处理条件作为一个整体 用操作符包裹
语法案例
mongo db.col.find({$or: [ {$and:[{"state1":11},{"state2":22}]},{"value":{$gte:300}} ]})
mysql select * from col where (stat1=11 and stat2=22) or value>=300
十 正则表达式
语法符号:$regex
语法标准:db.collection.find({column:{操作符:"正则表达式"})
语法案例: db.users.find({name: {$regex: /^B.*/}});
十一 基础补充
1 ({column:null}) 判断为NULL
2 {"column":{$exists:true}} 判断是否存在 存在返回整行数据,不存在则返回空
3 {"column":{$in:[null],$exists:true}} 判断是否存在列名并且列名为空的条件 是1+2的组合
4 支持js查询和mod计算.因为不常用,所以需要用到请参考官方文档进行使用
十二 函数讲解
说明:此部分介绍的函数比如排序 限制条数返回等都是拼接在find()之后.可以理解为mysql where 条件之后的处理
 
十三 聚合函数
说明:此部分类似于mysql的聚合函数功能,主要作用于统计相关
语法符号:$group分组 分组包裹全部,因为是最后执行
 
基本语法 db.colletion.aggregate({$group:{}}) db.collection.aggregate(column:{$sum:1})
 
语法案例:
mongo db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
mysql select by_user, count(*) from mycol group by by_user
 
十四 管道
说明:MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
基本符号:$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结 果以及嵌套文档。
$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
并不完全,余下请参考文档 上面的$sort $limit和$group等 也都属于管道
基本语法: 处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
十五 总结
对于复杂的SQL查询需求,按照拆解的方法来实现每个部分,然后利用相关的函数进行组合,最后达到你的目的,是非常不错的选择
 

mongodb 系列~查询

上一篇:js报错:Ajax 中onreadystatechange在ie7及以上浏览器兼容吗,为什么没有反应?求大神


下一篇:Mysql-01