zoukankan      html  css  js  c++  java
  • 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查询需求,按照拆解的方法来实现每个部分,然后利用相关的函数进行组合,最后达到你的目的,是非常不错的选择
     
  • 相关阅读:
    日志到底该如何打印?
    消息摘要(MessageDigest)
    URL编码及解码原理
    AES简介
    MySQL中整型长度的意义
    keytool生成密钥
    证书类型及秘钥库
    Base64编码及解码原理
    Holistically-Nested Edge Detection 论文总结
    全新bili主题
  • 原文地址:https://www.cnblogs.com/danhuangpai/p/14642897.html
Copyright © 2011-2022 走看看