zoukankan      html  css  js  c++  java
  • Mongodb数据查询 | Mongodb

    1.基本查询
        ①方法find():查询
            db.集合名称.find({条件文档})
        ②方法findOne():查询,只返回第一个
            db.集合名称.findOne({条件文档})
        ③方法pretty():将结果格式化
            db.集合名称.find({条件文档}).pretty()
    2.比较运算符
        # 等于,默认是等于判断,没有运算符
        # 小于,$lt   less-than
        # 小于或等于,$lte   less-than,equal
        # 大于,$gt    greater-than
        # 小于或等于,$gte    greater-than,equal
        # 不等于,$ne    not equal  
            db.collection2.find({name:'郭靖'})
            db.collection2.find({age:{$gte:18}})
    3.逻辑运算符
        ①逻辑与
            # 默认是逻辑与的关系
            # 例:查询年龄大于或等于18,并且性别为true的学生
                db.collection2.find({age:{$gte:18}, gender:true})
        ②逻辑或
            # 使用$or,值为数组,数组中每个元素为json
            # 例:查询年龄大于18,或性别为false的学生
                db.collection2.find({$or:[{age:{$gt:18}},{gender:false}]})
            注意点:find() >> 或条件下的{} >> $or[ ] >>
            >>  {条件a},{条件b} >> {域:{ 逻辑符判断} }
        ③或、与共用
            # 例:查询年龄大于18或姓名是郭靖,并且性别为男生
                db.collection2.find( {$or:[ {age:{$gt:18} },{name:'郭靖'} ],gender:true} )
    4.范围运算符
        # $in|$nin
        # 例:查询年龄为18,28的学生
            db.collection2.find( {age:{$in:[18, 28] } } )
        # 这里要注意了,最大与最小都需要表中含有这几个数
    5.支持正则表达式
        # 使用 // 或 $regex 编写正则表达式
        # 例:db.collection2.find( {name:/^黄/} )
            db.collection2.find( {name:{$regex:'^黄'} } )
    6.自定义查询
        # 使用$where后面写一个函数,返回满足条件的数据
        # 例:查询大于30岁的学生
            db.collection2.find(
            {
            $where: function(){
            return this.age > 18
            }})
    7.Limit和Skip
        ①方法limit():读取指定数量的文档
            # db.集合名称.find().limit(NUMBER)
            db.collection2.find().limit(2)
            # 附:如果指定参数则显示集合中的所有文档
        ②方法skip():用于跳过指定数量的文档
            # db.集合名称.find().skip(NUMBER)
            db.stu.find().skip(2)
            # 附:参数NUMBER表示跳过的记录条数,默认为0
        ③limit()与skip()一起使用
            # 不分先后顺序;跳过指定数量文档,再读取指定数量的文档
            # 查询数据
            db.collection1.find().limit(4).skip(5)
            db.collection1.find().skip(5).limit(4)
    8.投影
        --选择字段显示数据
            # ①db.集合名称.find({},{ 字段名称:1, ...})
            db.collection2.find({},{name:1, gender:1})
            # '1':表示显示字段,不设置表示不显示
            # ②特殊:对于_id列默认是显示的,
            # 如果不显示需要明确设置为0
            db.collection2.find({},{_id:0,name:1,gender:1})
    9.排序
        --对结果集进行排序
            参数1为升序排列
            参数-1位降序排列
        # db.集合名称.find().sort({字段:1....})
        # --根据性别降序,再根据年龄升序
            db.collection2.find().sort({gender:-1,age:1})
    10.统计个数
        ①方法count():用于统计结果集中文档条数
            1.db.集合名称.find({条件}).count()
            db.collection2.find({gender:true}).count()
            # --统计男生人数
    
            2.db.集合名称.count({条件})
            db.collection2.count({age:{$gt:20}, gender:true})
            # --统计年龄大于20的男生人数
    11.消除重复
        ①方法distinct():对字段数据进行去重,提取
        --db.集合名称.distinct('去重字段',{条件})
        db.collection2.distinct('hometown',{age:{$gt:18}})
        # 查询年龄大于18岁的学生,来自哪些省份
    
    # 4.聚合查询
    1.基本语法
        --语法
        db.集合名称.aggregate( {管道: {表达式} } )
        附:
            1.管道:在Unix和Linux中一般用于将当前命令的
            输出结果作为下一个命令的输入
            2.表达式:处理输入文档并输出
    2.常用表达式
        $sum: 计算综合,$sum:1 表示以一倍计数
        $avg: 计算平均值
        $min: 获取最小值
        $max: 获取最大值
        $push: 在结果文档中插入值到第一个文档数据
        $first: 根据资源文档的排序获取第一个文档数据
        $last: 根据资源文档的排序获取最后一个文档数据
    3.常用管道
        ①$group
            --将集合中的文档分组,可用于统计结果
            --_id表示分组的依据,使用某个字段的格式为'$字段'
                # 统计男生、女生的总人数
                db.stu.aggregate(
                    {$group:
                        {
                            _id:'$gender',
                            counter:{$sum:1}
                        }
                    }
                )
            --透视数据
                # 统计学生性别及学生姓名
                db.stu.aggregate(
                    {$group:
                        {
                            _id:'$gender',
                            name:{$push:'$name'}
                        }
                    }
                )
            --使用$$ROOT可以将文档内容加入到结果集的数组中
                db.stu.aggregate(
                    {$group:
                        {
                            _id:'$gender',
                            name:{$push:'$$ROOT'}
                        }
                    }
                )
        ②$match
            --修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
            --用于过滤数据,只输出符合条件的文档
            --使用MongoDB的标准查询操作
            # 查询年龄大于20的学生
            db.stu.aggregate(
                {$match:{age:{$gt:20}}}
            )
    
            # 查询年龄大于20的男生、女生人数
            db.stu.aggregate(
                {$match:{age:{$gt:20}}},
                {$group:{_id:'$gender',counter:{$sum:1}}}
            )
        ③$project
            --修改输入文档的结构,
               如重命名、增加、删除字段、创建计算结果
            # 查询学生的姓名、年龄
            db.stu.aggregate(
                {$project:{_id:0,name:1,age:1}}
            )
    
            # 查询男生、女生人数,输出人数
            db.stu.aggregate(
                {$group:{_id:'$gender',counter:{$sum:1}}},
                {$project:{_id:0,counter:1}}
            )
        ④$sort
            --将输入文档排序后输出
            # 查询学生信息,按年龄升序
            b.stu.aggregate({$sort:{age:1}})
    
            # 查询男生、女生人数,按人数降序
            db.stu.aggregate(
                {$group:{_id:'$gender',counter:{$sum:1}}},
                {$sort:{counter:-1}}
            )
        ⑤$limit和$skip
            --$limit
            # 限制聚合管道返回的文档数
            # 查询2条学生信息
                db.stu.aggregate({$limit:2})
    
            --$skip
            # 跳过指定数量的文档,并返回余下的文档
            # 查询从第3条开始的学生信息
                db.stu.aggregate({$skip:2})
    
            # 统计男生,女生人数,按人数升序,取第2条数据
                db.stu.aggregate(
                    {$group:{_id:'$gender', counter:{$sum:1}}}
                    {$sort:{counter:1}}
                    {$skip:1}
                    {$limit:1}
                )
        ⑥$unwind字段拆分查询
            --语法
            --文档中一个数组字段含有多个值
            --根据字段下的值拆分多条
            --每条包含数组中的一个值
               
            --db.集合名称.aggregate({$unwind:'$字段名称'})
                # $unwind聚合方法下含有两个属性:
                    path:'$字段名称'
                    preserveNullAndEmptyArrays:<布尔值>
                # 不填写属性,默认表示<布尔值>为false
                # 且不用标记属性名
            --构造数据
                db.t3.insert([
                { "_id" : 1, "item" : "a", "size": [ "S", "M", "L"] },
                { "_id" : 2, "item" : "b", "size" : [ ] },
                { "_id" : 3, "item" : "c", "size": "M" },
                { "_id" : 4, "item" : "d" },
                { "_id" : 5, "item" : "e", "size" : null }
                ])
            --查看查询结果,显示对空数组,无字段,null的文档
                db.t3.aggregate( { $unwind:{ path:'$size', preserveNullAndEmptArrays:true}})
    
            --查看查询结果,不显示空数组,无字段,null的文档
                db.t3.aggregate({$unwind: '$size'})  相当于:
                db.t3.aggregate({$unwind:{path:'$size', preserveNullAndEmptyArrays:false}})
    

      

  • 相关阅读:
    Java后端知识体系
    HashMap底层实现整理
    Java线程池
    Spring Boot+Dubbo 入门
    Go 代码记录(一)
    Servlet 复习
    Spring Cloud(二)Eureka:服务注册与发现
    Spring Cloud (一)概述
    数据结构基础知识
    容器技术-Docker入门
  • 原文地址:https://www.cnblogs.com/rianbowymail/p/9197536.html
Copyright © 2011-2022 走看看