一篇文章学会MongoDB的简单使用

文章目录

  • 为什么要选择mongodb
    • mongodb与mysql的对比
    • MongoDB的适用场景
  • mongodb的常用命令
    • 各种查询操作
      • 各种筛选方式
      • 控制查询结果展示规则
    • 增删改操作
      • 增加集合,文档,索引
      • 删除集合,文档,索引
      • 更新文档
  • java操作mongodb
    • 导入依赖
    • 创建数据映射实体类
      • 创建对mongodb数据操作的dao层

在我们的项目开发时,一般都是采用mysql作为持久化的数据库,但mysql也不是万能的,在某些场景下,使用mongodb往往会给相关业务程序
的查询性能、可扩展性带来巨大的提升。这篇文章主要介绍一下mongodb的快速入门,让大家用对用好mongodb。

为什么要选择mongodb

mongodb与mysql的对比

数据库对比如下:

MongoDB MySQL
数据库类型 非关系型 关系型
存储格式 json键值对 行列table的形式
查询语句 MongoDB特有查询 SQL规范
性能 内存合适时性能很快 中小量的数据性能很快
事务支持 不支持 支持
join查询 不支持 支持

此外,由于MongoDB的一些概念也不同。
MongoDB的数据粒度从大到小为------数据库实例->数据库(db)->集合(collection)->文档

MySQL的数据粒度从大到小为--------数据库实例->数据库(db)->表(table)->数据行

MongoDB的适用场景

(1)存储的数据对象适合采用json存储,而不适合采用传统的行数据存储。MYSQL的行列式存储对对于存储对象的格式要求非常严格,每个字段都必须
存在,存储对象字段变化(一般是增加字段)时难以维护。而MongoDB的采用json键值对格式存储就没有这个限制,每个文档都存在主键id,而其他的任何字段都是非常自由
的。如果分析业务中存储的某个数据对象在后续可能会进行字段的修改或者该数据对象就是json格式,可以考虑采用MongoDB存储。

(2)存储的数据量较大,需要较快的性能,并且内存资源充足。MongoDB将数据是存储在硬盘上的,但是经常读取的数据会被加载到内存中,从而达到
高速读写。在我们的内存资源充足时,完全可以考虑这种以空间换取时间的高效读写方法。

(3)对于数据的事务操作,join操作无要求或者要求较少。MongoDB是不支持事务以及join操作的,开发者只能自己采用新的设计实现这些功能。如果
业务场景对于这些操作不敏感,可以考虑选用MongoDB。

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”})

java操作mongodb

这里使用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;
}

创建对mongodb数据操作的dao层

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/

你可能感兴趣的:(数据库,数据库,服务器)