mongodb学习笔记二

本文详细介绍如何在SpringBoot项目中集成MongoDB,包括配置连接、实现增删改查等基本操作,并提供去除_class字段的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Springboot与MongoDB集成

我们走在Springboot的helloworld基础上,加上MongoDB的引用。首先我们要知道MongoDB的数据库连接地址书写格式为:
mongodb://[username:password@]host1[:port1][,host2[:port2],…[,hostN[:portN]]][/[database][?options]]
可以看到,这里是支持多机器集群使用的,我们这里使用的是本地环境为:
mongodb://localhost:27017/test

2、集成步骤

2.1 在pom文件中加入MongoDB的Springboot依赖:

<!--引入MongoDB依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

2.2 修改application.yml配置文件如下:

spring:
  application:
  #应用名称
    name: helloworld
  data:
    mongodb:
      uri: mongodb://localhost:27017/test

2.3 创建测试文件 MongoDBController

package com.nmm.study.controller;

import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @description 测试
 * @date 2017/11/26
 * @author Niemingming
 */
@Controller
@RequestMapping("/mongo")
public class MongoDBController {
    /**
     * @description MongoDB的数据库操作工具类
     * @date 2017/11/26
     * @author Niemingming
     */
    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * @description 插入操作
     * 我们创建一个mongotest集合并插入name和age两个field
     * @date 2017/11/26
     * @author Niemingming
     */
    @ResponseBody
    @RequestMapping("/insert/{name}/{age}/{id}")
    public String insert(@PathVariable String name,@PathVariable int age,@PathVariable String id){
        //构建数据对象
        DBObject data = new BasicDBObject("name",name);
        data.put("age",age);
        data.put("_id",id);
        //改行代码,如果没有集合mongotest,会自动创建一个,然后插入数据,为了方便修改,我们将id设置为前台录入。
        mongoTemplate.insert(data,"mongotest");
        return "success";
    }
    /**
     * @description 修改,根据id修改内容
     * @date 2017/11/26
     * @author Niemingming
     */
    @ResponseBody
    @RequestMapping("/update/{id}/{name}/{age}")
    public String update(@PathVariable String id,@PathVariable String name ,@PathVariable int age){
        //构建查询条件
        DBObject query = new BasicDBObject("_id",id);
        //构建修改对象
        DBObject data = new BasicDBObject("name",name);
        data.put("age",age);
        //这里获取集合执行更新操作,要特别说明的是第三个参数,表示是是否执行upsert操作,如果为true,表示会在更新时
        //检查是否由记录,如果没有执行插入操作,否则执行更新操作。如果为false,则只做更新操作。
        mongoTemplate.getCollection("mongotest").update(query,data,true,false);
        return "success";
    }

    /**
     * @description 执行删除操作。
     * @date 2017/11/26
     * @author Niemingming
     */
    @ResponseBody
    @RequestMapping("/remove/{id}")
    public String remove(@PathVariable String id ){
        DBObject query = new BasicDBObject("_id",id);
        mongoTemplate.getCollection("mongotest").remove(query);
        return "success";
    }

    /**
     * @description 查询所有记录
     * @date 2017/11/26
     * @author Niemingming
     */
    @ResponseBody
    @RequestMapping("/findAll")
    public String findAll(){
        //返回所有的查询记录
        return mongoTemplate.getCollection("mongotest").find().toArray().toString();
    }
}

2.4测试

编写完成,我们启动服务,在浏览器中首先输入:

这里我们设置了端口为8888
http://localhost:8888/mongo/insert/lisi/22/1
可以看到返回success

我们执行查询操作查看:

http://localhost:8888/mongo/findAll
返回
[{ "_id" : "1" , "_class" : "com.mongodb.BasicDBObject" , "name" : "lisi" , "age" : 22}]

可以看到,数据已经插入进去了。这里会看到多了个_class字段,这个字段是mongodb的java版加进去的,如果不想要,我们下面会介绍如何去掉该字段。
执行修改操作:

http://localhost:8888/mongo/update/1/wangwu/32
返回:
success
查询
http://localhost:8888/mongo/findAll
返回:
[{ "_id" : "1" , "name" : "wangwu" , "age" : 32}]

删除操作:

http://localhost:8888/mongo/remove/1
查询:
http://localhost:8888/mongo/findAll
返回
[]

2.5MongoDBjava客户端增加_class字段去除方法:

方法一:不使用mongoTemplate做直接插入,通过获取集合后执行插入方法,修改插入方法如下:

 @ResponseBody
    @RequestMapping("/insert/{name}/{age}/{id}")
    public String insert(@PathVariable String name,@PathVariable int age,@PathVariable String id){
        //构建数据对象
        DBObject data = new BasicDBObject("name",name);
        data.put("age",age);
        data.put("_id",id);
        //改行代码,如果没有集合mongotest,会自动创建一个,然后插入数据,为了方便修改,我们将id设置为前台录入。
        mongoTemplate.getCollection("mongotest").insert(data);
        return "success";
    }

这时在执行上面插入查询操作

http://localhost:8888/mongo/insert/lisi/22/1
http://localhost:8888/mongo/findAll
[{ "_id" : "1" , "name" : "lisi" , "age" : 22}]

可以看到,没有多出的_class字段。
方法二:修改MongoDB的配置信息,自己创建MappingMongoConverter对象。创建MongoConfiguration类:

package com.haier.alertmanager.configuration;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;

/**
 * @description mongo配置类,用于去掉java自动生成的_class字段
 * @date 2017/11/16
 * @author Niemingming
 */
@Configuration
public class MongoConfiguration {
    @Autowired
    private MongoDbFactory mongoDbFactory;
    @Autowired
    private MongoMappingContext mongoMappingContext;

    @Bean
    public MappingMongoConverter mappingMongoConverter(){
        DefaultDbRefResolver refResolver = new DefaultDbRefResolver(mongoDbFactory);
        MappingMongoConverter converter = new MappingMongoConverter(refResolver,mongoMappingContext);
        //将默认的mapper类型设置为null,这样就不会再库中生成额外字段。
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));
        return converter;
    }
}

我们将默认的类型设置为null,之后在使用mongoTemplate.insert()时,也不会在插入_class字段了。
代码已经上传到GitHub上了。
源码地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值