mongodb使用一套下来,我整个人麻了

简介

  • NoSQL = Not Only SQL
  • 我们平时开发熟悉的是关系型数据库,而MongoDB是新型非关系型数据库。

使用场景

  • NoSQL用于超大规模数据的存储,谷歌或者Facebook每天为他们的yoghurt手机万亿比特的数据,这些类型的数据存储不需要固定的模式,无须多余的操作就可以和横向扩展了。

RDBMS vs NoSQL

语言 概括 结构化 性能
RDBMS 高度组织化结构化数据 结构化查询语言 基础事务
NoSQL 代表着不仅仅是SQL 没有声明性查询语言 高性能高可用性和可伸缩性

常用命令

基本结构体

java 复制代码
public class User {
    //主键
    private Long id;
    //用户名
    private String userName;
    //年龄
    private Integer age;
    //性别
    private Boolean sex;
    //出生日期
    private Date birthDate;
    //上学日期
    private Date schoolDate;
    //工资
    private Double salary;
}

查询

查询ID=139758337331900416的值

sql方式

select * from user where id=139758337331900416

常规查询

db.user.find({'_id':139758337331900416})

高级查询
json 复制代码
db.user.aggregate(
[
    {
        $match: {
            _id: 139758337331900416
        }
    }
]
)

模糊查询userName中包含fff5fdd6的数据

sql方式

select * from user where userName like '%fff5fdd6%';

常规查询

/abc/ : 全模糊匹配abc /^abc/: 模糊匹配abc开头 /^abc$/: 查询等于abc的数据(正则)

db.user.find({'userName':/fff5fdd6/});

高级查询

主要就是正则表达式的编写来实现匹配

json 复制代码
db.user.aggregate(
[
    {
        $match: {
            'userName': {
                $regex: '.*fff5fdd6'
            }
        }
    }
]
)

查询年龄大于1720822682的数据

sql方式

select * from user where age>1720822682;

常规查询

db.user.find({'age':{'$gt':1720822682}});

高级查询
json 复制代码
db.user.aggregate([
  {
    '$match': {
        'age': {
            '$gt': 1720822682
        }
    }
}
]);

按照id降序

sql方式

select * from user order by id desc;

常规查询

db.user.find().sort({'_id':-1});

高级查询
json 复制代码
db.user.aggregate([
  {
    $order:{
      _id:-1
    }
  }
]);

按照字段部分排序

比如userName是uuid格式的f21bad93-bcb2-48a1-9446-d429cfb8a63d,这个时候userName中-分割的最后一部分排序即d429cfb8a63d.

sql方式
sql 复制代码
select \* from user order by substr((userName),LENGTH(userName)+1-(locate('/',REVERSE(userName))-1));
常规查询

mongo的常规查询只能是常规的操作。这里需求就无法满足。这就是高级查询aggregate的高级之处。他支持我们逻辑操作

高级查询

高级查询中我们会发现查询出的字段只有参与排序的字段和Id字段。如何我们需要显示其他字段需要在最后一个 <math xmlns="http://www.w3.org/1998/Math/MathML"> p r o j e c t 中将字段配置出来,如 r e g i o n s : 1 表示显示;第一个 project中将字段配置出来,如regions:1表示显示;第一个 </math>project中将字段配置出来,如regions:1表示显示;第一个project中的"userName":"$userName"表示展示userName字段。

json 复制代码
db.user.aggregate(
	[
    {
        $project: {
            "userName":"$userName",
            "regions": {
                $split: [
                    '$userName',
                    '-'
                ]
            }
        }
    },
    {
        $project: {
            "regions": 1,
            "userName":1,
            "userNameOrder": {
                $arrayElemAt: [
                    "$regions",
                    4
                ]
            }
        }
    },
    {
        $sort: {
            userNameOrder: -1
        }
    }
]
)

分组

报表查询中最常见的就是分组查询了。 下面我们按照入学时间(具体到天)分组汇总信息

sql方式

select date_format(schoolData,'%Y-%m-%d') , count(1) from user group by date_format(schoolData,'%Y-%m-%d') order by date_format(schoolData,'%Y-%m-%d');

常规查询

高级查询
json 复制代码
db.user.aggregate(
[
    {
        $project: {
            "newSchoolDate": {
                $dateToString: {
                    date: '$schoolDate',
                    format: "%Y-%m-%d"
                }
            }
        }
    },
    {
        $group: {
            "_id": "$newSchoolDate",
            "count": {
                $sum: 1
            }
        }
    },
    {
        $sort: {
            newSchoolDate: -1
        }
    }
]
)

关键字

上面我们通过几个常见的案例了解了mongo的功能。基本上sql可以实现的效果,mongo都可以。下面我们就看看mongo里的常见的函数功能。

bucket功能是分段统计表数据,上面的 <math xmlns="http://www.w3.org/1998/Math/MathML"> g r o u p 的分组时针对全表的。但是我们有的时候希望一定范围内按照一定规则统计,剩下的按照另外的规则统计。这个时候我们如果使用 group的分组时针对全表的。但是我们有的时候希望一定范围内按照一定规则统计,剩下的按照另外的规则统计。这个时候我们如果使用 </math>group的分组时针对全表的。但是我们有的时候希望一定范围内按照一定规则统计,剩下的按照另外的规则统计。这个时候我们如果使用group就需要用两个命令才能解决。

json 复制代码
db.user.aggregate(
    [
    {
        $bucket: {
            groupBy: "$age",
            boundaries: [
                1,
                458972139,
                1542997977
            ],
            default: 'ooo',
            output: {
                "count": {
                    $sum: 1
                },
                "titles": {
                    $push: "$age"
                }
            }
        }
    }
]
)

集合$project使用

json 复制代码
db.user.aggregate(
[
    {
        $project: {
            "newSchoolDate": {
                $dateToString: {
                    date: '$schoolDate',
                    format: "%Y-%m-%d"
                }
            }
        }
    },
    {
        $bucket: {
            groupBy: "$newSchoolDate",
            boundaries: [
                '2021-01-20',
                '2021-01-21'
            ],
            default: 'ooo',
            output: {
                "count": {
                    $sum: 1
                },
                "titles": {
                    $push: "$_id"
                },
                "schoolds": {
                    $push: "$newSchoolDate"
                }
            }
        }
    },
    {
        $sort: {
            "_id": -1
        }
    }
]
)
相关推荐
熊大如如25 分钟前
Java 反射
java·开发语言
巨龙之路37 分钟前
什么是时序数据库?
数据库·时序数据库
蔡蓝42 分钟前
binlog日志以及MySQL的数据同步
数据库·mysql
猿来入此小猿44 分钟前
基于SSM实现的健身房系统功能实现十六
java·毕业设计·ssm·毕业源码·免费学习·猿来入此·健身平台
goTsHgo1 小时前
Spring Boot 自动装配原理详解
java·spring boot
卑微的Coder1 小时前
JMeter同步定时器 模拟多用户并发访问场景
java·jmeter·压力测试
是店小二呀2 小时前
【金仓数据库征文】金融行业中的国产化数据库替代应用实践
数据库·金融·数据库平替用金仓·金仓数据库2025征文
pjx9872 小时前
微服务的“导航系统”:使用Spring Cloud Eureka实现服务注册与发现
java·spring cloud·微服务·eureka
炒空心菜菜2 小时前
SparkSQL 连接 MySQL 并添加新数据:实战指南
大数据·开发语言·数据库·后端·mysql·spark
多多*2 小时前
算法竞赛相关 Java 二分模版
java·开发语言·数据结构·数据库·sql·算法·oracle