简介
- 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
}
}
]
)