数据库对比如下:
MongoDB | MySQL | |
---|---|---|
数据库类型 | 非关系型 | 关系型 |
存储格式 | json键值对 | 行列table的形式 |
查询语句 | MongoDB特有查询 | SQL规范 |
性能 | 内存合适时性能很快 | 中小量的数据性能很快 |
事务支持 | 不支持 | 支持 |
join查询 | 不支持 | 支持 |
此外,由于MongoDB的一些概念也不同。
MongoDB的数据粒度从大到小为------数据库实例->数据库(db)->集合(collection)->文档
MySQL的数据粒度从大到小为--------数据库实例->数据库(db)->表(table)->数据行
(1)存储的数据对象适合采用json存储,而不适合采用传统的行数据存储。MYSQL的行列式存储对对于存储对象的格式要求非常严格,每个字段都必须
存在,存储对象字段变化(一般是增加字段)时难以维护。而MongoDB的采用json键值对格式存储就没有这个限制,每个文档都存在主键id,而其他的任何字段都是非常自由
的。如果分析业务中存储的某个数据对象在后续可能会进行字段的修改或者该数据对象就是json格式,可以考虑采用MongoDB存储。
(2)存储的数据量较大,需要较快的性能,并且内存资源充足。MongoDB将数据是存储在硬盘上的,但是经常读取的数据会被加载到内存中,从而达到
高速读写。在我们的内存资源充足时,完全可以考虑这种以空间换取时间的高效读写方法。
(3)对于数据的事务操作,join操作无要求或者要求较少。MongoDB是不支持事务以及join操作的,开发者只能自己采用新的设计实现这些功能。如果
业务场景对于这些操作不敏感,可以考虑选用MongoDB。
在开发过程时,我们经常需要对数据库进行一些增删查改操作,而MongoDB的查询语句是特有的,这就要求我们掌握MongoDB的查询语法,常用的查询如下
所示。
假设要对Test集合的文档进行增删查改操作,test集合的文档格式大致如下(这个文档存储了对象以及数组):
{
"id": 2038673,
"time": "2022-02-22",
"_class": "com.hx.TestMongo",
"object1": {
"element1": 123,
"element2": "123"
},
"array1": [
{
"name": "hx",
"age": 18
},
{
"name": "test",
"age": 18
}
]
}
比较符表示方法
含义 | MongoDB | MySQL |
---|---|---|
等于 | $eq | = |
大于 | $gt | > |
大于 | $gte | >= |
小于 | $lt | < |
小于等于 | $lte | <= |
不等于 | $ne | != |
包含于 | $in | in |
不包含于 | $nin | not in |
模糊查询表示方法----使用正则表达式$regex:正则表达式
例如:查询time字段包含"2022"字符串
db.Test.find({“time”:{$regex:“2022”}})
(1)简单筛选----find函数(支持模糊查询)
查询集合中id为2038673的文档----db.Test.find({“id”:2038673})
(2)复合筛选----and以及or逻辑
查询集合中id大于0并且time包含"2022"的文档----db.Test.find({“id”:2038673,“time”:{$regex:“2022”}})
(3)筛选对象里的属性字段
查询集合中object1中的element1为123的文档----db.Test.find({“object1.element1”:2038673})
(4)筛选数组里的下表元素中的属性字段
查询集合中array1数组第一个元素name属性为hx的文档----db.Test.find({“array1.0.name”:“hx”})
(1)只展示文档数量----count函数
展示集合中的文档数量----db.Test.find().count()
(2)按照排序规则展示----sort函数
展示集合中所有文档并按照id倒序排序展示----db.Test.find().sort({“id”,-1})
(3)限制查询数量----limit函数
展示集合中100条文档----db.Test.find().limit(100)
(4)只显示部分字段----查询条件后加{字段名:1(1代表显示,-1代表不显示)}
只展示100条集合文档中的id字段,并且id不等于1,按照id倒序排序----db.Test.find({“id”:{$ne:1}},{“id”:1}).
(1)创建新集合
创建新集合Test1----db.Test1
(2)插入文档----insert或者insertMany命令
在集合Test插入一个文档----db.Test.insert({“id”:12,“time”:“2022-01-22”})
(3)建立索引----createIndex命令
在集合Test以字段id建立索引----db.Test.createIndex({“id”,1})
(1)删除集合----drop命令
删除Test1集合----db.Test1.drop()
(2)删除文档----deleteOne以及deleteMany命令
删除Test中的id为1的第一个文档----db.Test.deleteOne({“id”:1})
(3)删除索引----dropIndex命令
删除索引名为abc的索引----db.Test.dropIndex(“abc”);
如果不清楚索引名,可以使用该命令查看----db.Test.getIndexes()
(1)更新文档----update以及updateMany命令
更新所有id大于1的文档,设置time为"2022-02-22"----db.Test.updateMany({“id”:{$gt:1}},{“time”:“2022-02-22”})
这里使用MongoTemplate来操作MongoDB
springboot里面集成了操作mongodb的依赖,引入即可。注意版本
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-mongodbartifactId>
<version>2.1.13.RELEASEversion>
dependency>
注意正确使用注解,以及字段对应关系。
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
import java.util.List;
@Document("Test")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TestObject {
//使用Indexed注释的索引名称一定要对应
@Indexed(name = "idx_id")
private Long id;
private String time;
private Object1 object1;
private List<Object2> array1;
}
import com.mongodb.client.result.UpdateResult;
import com.mongodb.client.result.DeleteResult;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
/**
* @author liqiao
* @since 2018.12.10
*/
@Repository("testObjectDao")
public class TestObjectDao {
@Resource
private MongoTemplate mongoTemplate;
public void save(TestObject testObject) {
mongoTemplate.save(testObject);
}
public TestObject get(long id) {
return mongoTemplate.findOne(new Query(Criteria.where("id").is(id)), TestObject.class);
}
public boolean update(long id, String time) {
UpdateResult updateResult = mongoTemplate.updateFirst(new Query().addCriteria(Criteria.where("id").is(id)), new Update().set("time", time), TestObject.class);
return updateResult.getModifiedCount() > 0;
}
public boolean delete(long id){
DeleteResult result = mongoTemplate.remove(new Query(Criteria.where("id").is(id)),TestObject.class);
return result.getDeletedCount()>0;
}
}
更多细致的知识点可以参考官网:https://docs.mongodb.com/