• MongoDB常用SQL


    基本查询

    简单查询

    find({"comId":"1012", "group":123})

    包含:$in

    find({name: {$in:["zhangsan", "lisi"]}})             #in是匹配[]中任意一个值即可
    find({name: {$in:[/^zh/, /si$/]}})                   #查询name字段中,以zh开头或者si结尾的
    find({"procTree.pid": {$in: [2011, 2012]}})          #当字段为一个数组时,数组中的任一元素匹配[]中任意一个值即可

    匹配所有:$all

    find({"procTree.pid": {$all: [2011, 2012]}})      #all是必须匹配[]中所有值才算匹配

    范围查询

    操作符:$gte:大于等于 $lte:小于等于 $eq:等于

    find({age: {$lt:20}})     #查询age<20的
    find({age: {$gt:20}})     #查询age>20的
    find({tags: {$ne:null}})  #查询tags不为空的

    数组中元素个数:$size

    find({"procTree": {$size: 2}})    #查询procTree数组中有两个元素的

    模糊查询

    find({"comId":/11/})              #查询comId包含11的(全模糊匹配)
    find({"comId":/^11/})             #前缀匹配
    find({"comId":{$regex:"^11"}})                  #前缀匹配         
    find({"comId":{$regex:"12$", $options:"i"}})    #后缀匹配,忽略大小写

    “非”查询:$not、$nin

    $not后面只能接表达式,比如正则、$gt等

    find({name: {$not: /zhang/}})               #查询name字段,不是以zhang开头的
    find({age: {$not: {$gt: 30}}})              #查询age字段,不是大于30的,即小于等于30的
    find({name: {$nin: [/^zh/, /si$/]}})        #查询name字段,不是以zh开头或者si结尾的
    find({name: {$nin: ["zhangsan", "lisi"]}})  #查询name字段,既不等于zhangsan也不等于lisi的

    投影查询

    find({"comId":{$regex:"12$"}, {"comId":1, "detectType":1, "group":1, "_id":0})     #1表示显示,0表示不显示。_id默认显示,要不想显示,需要设置为0

    分页查询

    find().skip(3).limit(2)            #跳过3条数据,然后返回最多2条数据

    查询数据条数:count()

    find({"comId":"1012"}).count()                #返回find过滤后的数据条数
    find({"comId":"1012"}).limit(2).count(true)   #返回2条数据。使用了limit的sql,如果直接使用count(),里面参数不是true或者非0的,那返回的结果就是全部的(跟上面一样)

    排序:sort()

    find({"comId":"1012"},{"group":1, "_id":0}).sort({"group":1})   #根据group排序。1是升序,-1是降序

    聚合查询

    计数、求和:$sum

    aggregate([{$group: {_id:null, cou: {$sum:1}}}])                #相当于select count(*) cou from dev
    aggregate([{$group: {_id:null, totalAge: {$sum:"$age"}}}])      #相当于select sum(age) totalAge from dev
    aggregate([{$group: {_id:"$name", totalAge: {$sum:"$age"}}}])   #相当于select name _id, sum(age) totalAge from dev group by name

    条件筛选:$match

    aggregate([{$match: {age: {$gt:20}}}, {$group: {_id:null, cou: {$sum:1}}}])                    #相当于select count(*) cou from dev where age>20
    aggregate([{$group: {_id:"$name", totalAge: {$sum:"$age"}}}, {$match:{totalAge: {$gt:25}}}])   #相当于select name _id, sum(age) totalAge from dev group by name having totalAge>25

    最大、最小、平均值:$max、$min、$avg

    aggregate([{$group: {_id:null, maxAge: {$max:"$age"}}}])        #相当于select max(age) maxAge from dev
    aggregate([{$group: {_id:null, minAge: {$min:"$age"}}}])        #相当于select min(age) minAge from dev
    aggregate([{$group: {_id:null, avgAge: {$avg:"$age"}}}])        #相当于select avg(age) avgAge from dev

    统计结果返回数组:$push、$addToSet

    aggregate([{$group: {_id:"$name", ageArr: {$push:"$age"}}}])        #按照name分组,使用数组返回组内所有的age值(不会去重)
    aggregate([{$group: {_id:"$name", ageArr: {$addToSet:"$age"}}}])    #按照name分组,使用数组返回组内所有的age值(会去重)

    数组字段拆分:$unwind

    注意:文档中没有tags字段的不会显示

    aggregate([{$unwind:"$tags"}])   #将集合中所有tags字段(数组)拆分成单个显示。比如某个文档中tags有三个元素,则会拆分成三条数据

    聚合投影查询  $project

    注意:$project后面的投影查询,字段后面既可以使用变量(如"$name"),也可以使用数字(0或1)。不过,如果想字段名称取别名,则只能使用变量

    aggregate([{$unwind:"$tags"}, {$project:{_id:0,name:"$name", tags:1}}])       #将tags数组的内容拆分,并只显示name和tags键

    字符串操作   $project

    注意:$concat中的字段变量只能为字符串类型

    aggregate([{$project:{_id:0, Name:{$toUpper:"$name"}}}])                                       #name的值转为大写并取别名Name。转小写:toLower
    aggregate([{$unwind:"$tags"}, {$project:{_id:0, nameTags:{$concat:["$name", "-", "$tags"]}}}]) #将tags数组的内容拆分,name字段和tags字段拼接并取别名nameTags
    aggregate([{$project:{_id:0, namePrefix:{$substr:["$name", 0, 3]}}}])                          #只显示name字段前三个字符并取别名namePrefix

    日期处理

    MongoDB中的时间会比系统当前时间少8h。因为默认是UTC时区,而中国的时区是东八区,比UTC快8h

    插入日期

    insert({time:new Date()})                         #会比系统时间少8h
    insert({time:new Date("2020-05-20T10:30:46Z")})   #必须严格按照日期格式,否则插入的日期或时间会有问题
    insert({time:ISODate("2020-05-20 10:30:46")})     #ISODate为内置函数,不用完全按照上面的日期格式,它会自动转成正确的

    日期过滤查询

    find({time: {$eq:new Date("2020-05-20T10:30:46Z")}})  
    find({time: {$gt:ISODate("2020-05-20 10:30:46")}})

    日期处理查询

    注意:$dayOfWeek:星期日为1,星期六为7,$week:计数从0开始

    aggregate([{$match:{time: {$ne:null}}},{$project:{year:{$year:"$time"}, month:{$month:"$time"}, day:{$dayOfMonth:"$time"}}}])   #查询time字段的年、月、日
    aggregate([{$match:{time: {$ne:null}}},{$project:{hour:{$hour:"$time"}, minute:{$minute:"$time"}, second:{$second:"$time"}, milSec:{$millisecond:"$time"}}}])   #查询time字段的时、分、秒、毫秒
    aggregate([{$match:{time: {$ne:null}}},{$project:{星期:{$dayOfWeek:"$time"}, 全年第几周:{$week:"$time"}, 全年第几天:{$dayOfYear:"$time"}}}])

    显示自定义日期格式

    aggregate([{$match:{time: {$ne:null}}},{$project:{myTime:{$dateToString:{format:"%Y-%m-%d %H:%M%S", date:"$time"}}}}])

    更新

    语法格式:update({查询条件}, {更新内容}, {更新参数(可选)})

    update({name:"zhangsan"},{age:100})                          #文档更新成指定的内容,即更新后文档只有_id和age字段了
    update({name:"zhangsan"},{$set: {age:200}})                  #加了$set,只更新指定字段,不会改变文档字段(只会更新第一条数据)
    update({name:"zhangsan"},{$set: {age:200}, {multi:true}})    #multi表示会更新所有数据

    索引

    创建索引

    语法格式:createIndex({创建索引的键: 排序规则}, {创建索引参数(可选)})

    createIndex({name:1})       #为name创建正序索引
    createIndex({name:1, age:-1},{name:"idx_name_age"})    #为name和age创建复合索引,索引名称为idx_name_age

    排序规则:1:正序  -1倒序

    索引参数:

    参数 数据类型 默认值 功能
    background Boolean false 后台建立索引,创建索引时不阻塞其它操作
    expireAfterSeconds Integer   指定索引过期时间
    name String   指定索引名称,如果未指定,MongoDB会生成一个索引字段名称_排序顺序的名称
    sparse Boolean false 对文档中不存在的字段数据不启用索引
    unique Boolean false 创建唯一索引

     

     

     

     

     

     

    注意点:如果集合中字段索引已存在,再次为该字段创建索引不会生效

    查看索引

    getIndexes()              #查看集合中所有索引信息
    getIndexKeys()            #查看集合中所有的索引键
    totalIndexSize(可选参数)   #查看集合中索引的大小,单位字节。参数说明:可选参数为0、false或者空,显示所有索引的总大小,其它值显示每个索引的大小及总大小

    删除索引

    dropIndex("idx_name")    #删除索引名称为idx_name的索引
    dropIndexes()            #删除全部索引,_id键的索引除外

    重建索引

    使用场景:数据大量变化后,可以使用重建索引构建更高效的B-Tree,优化索引查询效率

    过程说明:重建索引是删除原索引重新创建的过程,不建议反复使用

    reIndex()
    知识改变世界
  • 相关阅读:
    C# 移除string[] 数组中的指定元素
    传入一个字符串参数 获取这个字符串内所有字符的 不同排列情况
    js 更新本地当前时间
    js 通过单选框 展开和收缩 下拉框
    js 做加法
    js 验证 输入的值是否为整数
    用一个button控件调用fileupload控件的获取路径功能
    删除表中的多余的记录
    实验楼 实现课程模块
    微博回调接口(django)
  • 原文地址:https://www.cnblogs.com/xuwenjin/p/14915586.html
Copyright © 2020-2023  润新知