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字段。如何我们需要显示其他字段需要在最后一个 p r o j e c t 中将字段配置出来,如 r e g i o n s : 1 表示显示;第一个 project中将字段配置出来,如regions:1表示显示;第一个 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功能是分段统计表数据,上面的 g r o u p 的分组时针对全表的。但是我们有的时候希望一定范围内按照一定规则统计,剩下的按照另外的规则统计。这个时候我们如果使用 group的分组时针对全表的。但是我们有的时候希望一定范围内按照一定规则统计,剩下的按照另外的规则统计。这个时候我们如果使用 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
        }
    }
]
)
相关推荐
Elastic 中国社区官方博客11 分钟前
列式存储并不等同于列式数据库。Columnar 模式为 Elasticsearch 带来了什么
大数据·运维·数据库·elasticsearch·搜索引擎
aramae38 分钟前
模拟实现strlen()函数 (C语言)
c语言·开发语言·后端
我要见SA姐11 小时前
用 Claude Code 重构遗留系统:从评估到落地的完整实践指南
数据库·ide·vscode·oracle·编辑器
SL_staff1 小时前
别急着买商业规则引擎:90%风控场景根本不需要全量编码能力
java·程序员·groovy
ManageEngineITSM1 小时前
DevOps和ITIL是什么关系?是替代还是互补一文讲清
java·服务器·资产管理·变更管理
IT_陈寒2 小时前
Python的GIL把我坑惨了,多线程跑得比单线程还慢
前端·人工智能·后端
分支预测失败2 小时前
RISC-V 时间子系统深度专题:mtime 访问路径、SBI 定时器与 Linux tickless 协同
后端
65岁退休Coder2 小时前
PI Agent 开发一个生产级 Harness
后端·node.js·agent
SL_staff2 小时前
ERP排程总在纸上谈兵?JVS-APS如何用真实产能约束打通计划与执行闭环
java·人工智能·开源
xcl09252 小时前
24小时自助健身房系统软件开发实战指南:从架构到部署
java·spring boot