MongoDB的优缺点以及springboot中的使用

MongoDB是一款分布式文件存储的非关系型数据库,适合Web应用的高性能数据存储。其优点包括弱一致性、文档结构存储、丰富的查询表达和优秀的性能。适用于游戏、物流、社交等场景,但不支持事务且空间占用大。文章提供了MongoDB在Java中的使用示例,并列出了相关配置。
摘要由CSDN通过智能技术生成

MongoDB简介
一款介于关系数据库和非关系数据库之前的产品,基于分布式文件存储的数据库,旨再为WEB引用提供可扩展的高性能数据存储解决方案,将数据存储为一个文档(类似JSON对象),数据结构由键值(key=>value)对组成支持丰富的查询表达,可以设置任何属性的索引;支持副本集、分片。

总而言之: MongoDB介于缓存与数据库之间,存取速度逊于缓存但远远高于传统数据库。

MongoDB的优点:

1、弱一致性(最终一致),更能保证用户的访问速度
2、文档结构的存储方式,能够更便捷的获取数据
对于一个层级式的数据结构来说,如果要将很多的数据使用扁平式的、表状的结构来保存数据,这不管是在查询还是获取数据时都会很困难。
3、第三方支持丰富。
这是它跟其它的NoSQL相比,MongoDB也具有的优势,因为现在网络上的很多NoSQL开源数据库完全属于社区型的,没有官方支持,给使用者带来了很大的风险。
而开源的文档数据库MongoDB背后有商业公司为它提供商业培训和支持。
4、性能优越
在使用场合下,千万级别的文档对象,近10G的数据,对有索引的ID的查询不会比mysql慢,而对非索引字段的查询,则是全面胜出。 mysql实际无法胜任大数据量下任意字段的查询,而mongodb的查询性能可以,同时它的写入性能也很厉害,可以写入百万级别的数据。

MongoDB的缺点:

1、MongoDB不支持事务操作
所以事务要求严格的系统,比如银行系统就不能用它。
2、MongoDB占用空间过大
2.1、空间的预分配:
当MongoDB的空间不足时它就会申请生成一大块硬盘空间,而且申请的量都是有64M、128M、256M来增加直到2G为单个文件的较大体积,并且随着数量叠增,可以在数据目录下看到整块生成而且不断递增的文件。
2.2、删除记录不释放空间:
这很容易理解,为避免记录删除后的数据的大规模挪动,原记录空间不删除,只标记“已删除”即可,以后还可以重复利用。
3、(开发和IT运营要注意)MongoDB没有MySQL那样成熟的维护工具

MongoDB的使用场景:

(1)游戏场景
使用MongoDB存储游戏用户信息、装备、积分等,直接以内嵌文档的形式存储,方便查询、更新。
(2)物流场景
使用MongoDB存储订单信息、订单状态、物流信息,订单状态在运送过程中飞速迭代、以MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更查出来,牛逼plus。
(3)社交场景
使用MongoDB存储用户信息,朋友圈信息,通过地理位置索引实现附近的人、定位功能。
(4)物联网场景
使用MongoDB存储设备信息、设备汇报的日志信息、并对这些信息进行多维度分析。
(5)视频直播
使用MongoDB存储用户信息、点赞互动信息。

MongoDB的使用场景总结:

1.数据量大
2.读写操作频繁
3.数据价值较低,对事务要求不高

MongoDB的java代码

YML配置信息

  
spring:
  data:
    mongodb:            #mongodb数据库
      host: localhost   #连接服务器地址(默认本地127.0.0.1)
      port: 27017       #端口号  (默认27017)
      database: fan     #指定连接的数据库
<!--  引入SpringBoot集成MongoDB的Jar包  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
package com.fan.mongodb;

import com.fan.dto.PersonDTO;
import com.fan.entity.Person;
import com.fan.vo.ResponseVO;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author およそ神
 * @version JDK 1.8
 */
@RestController
@RequestMapping(value = "/mongo")
@Api(tags={"mongo数据库CRUD测试"})
@Slf4j
public class MongodbController {

    /**  MongoTemplate 实现构建对MongoDB的CRUD */
    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 新增
     * @param person
     * @return
     */
    @PostMapping(value = "/save")
    public ResponseVO save(Person person) {
        person.setUpdateby("fan");
        Person save = this.mongoTemplate.save(person);
        System.out.println(save);
        return ResponseVO.ok();
    }


    @PostMapping(value = "/update")
    public ResponseVO update(PersonDTO person) {
        Query query = new Query(Criteria.where("id").is(person.getId()));
        Update update = new Update().set("name",person.getName()).set("age",person.getAge());
       // UpdateResult result = this.mongoTemplate.updateFirst(query, update, Person.class);
        UpdateResult result = this.mongoTemplate.updateMulti(query, update, Person.class);
        return ResponseVO.okHasData(result);
    }

    @GetMapping(value = "/find")
    public ResponseVO find(PersonDTO person) {
        Query query = new Query(Criteria.where("id").is(person.getId()));
        Person result = mongoTemplate.findOne(query, Person.class);
        return ResponseVO.okHasData(result);
    }

    @PostMapping(value = "/remove")
    public ResponseVO remove(PersonDTO person) {
        Query query = new Query(Criteria.where("id").is(person.getId()));
        DeleteResult result = mongoTemplate.remove(query, Person.class);
        return ResponseVO.okHasData(result);
    }
}

sql

//db.book.save({"name":"springboot"});
//db.book.save({"age":"666"});
//db.book.insert({"name":"mango good"});
//db.book.save({"name":"springboot",type:"工具书"});

//2 查询所有数据2种写法
//db.book.find()
//db.getCollection("book").find()

//2 条件查询
//db.book.find({type:"工具书"}).
//db.book.find({name:"mango good"})

//3 修改"name":"springboot"的数据为"name","springboot2"
//update:遇到满足条件的第一条数据修改
//db.book.update({"name":"springboot"},{$set:{"name":"springboot2"}})

//updateMany :修改所有满足条件的
//db.book.updateMany({"name":"springboot"},{$set:{age:"23"}})


//updateOne:修改满足条件的第一条数据
//db.book.updateOne({"name":"springboot"},{$set:{type:"springboot3","age":"666"}})


//4 删除
//db.book.remove({type:"工具书"})


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MongoDB是一种非关系型数据库,具有以下优点和缺点: 优点: 1. 灵活的数据模型:MongoDB采用了文档型数据模型,可以存储非结构化或半结构化的数据,非常适合处理复杂的数据。 2. 高可扩展性:MongoDB支持水平扩展,可以通过添加更多的节点来增加系统的处理能力,从而应对大规模数据的存储和查询需求。 3. 高性能:MongoDB使用内存映射文件和索引来提供快速的数据访问,适用于对大量数据进行读写操作。 4. 强大的查询功能:MongoDB支持丰富的查询语言和复杂的查询操作,包括范围查询、正则表达式、聚合等,使得数据的检索和分析变得非常灵活和高效。 5. 自动分片和容错机制:MongoDB自带的自动分片和容错机制可以保证数据的可靠性和高可用性。 缺点: 1. 不支持事务:MongoDB在3.2版本之前不支持多文档的事务处理,虽然现在已经支持了原子操作,但仍然不如关系型数据库在事务处理方面强大。 2. 内存占用较高:由于MongoDB使用内存映射文件来提供高性能的数据访问,因此需要较多的内存来存储数据,这可能导致在内存不足的情况下性能下降。 3. 存储空间浪费:MongoDB的文档存储格式会占用一定的空间,特别是对于小型数据,存储效率相对较低。 4. 数据一致性:MongoDB的分布式特性可能导致数据一致性的问题,在网络分区或节点故障的情况下,可能会出现数据不一致的情况。 总的来说,MongoDB适用于大规模、高性能、非结构化或半结构化数据的存储和查询,但在事务处理和数据一致性方面相对弱一些。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值