MongoDB 的实际应用

MongoDB 作为查询性能优越的 NoSql 数据库,在项目中的运用越来越多,逐渐变成主要的数据库

下面,在 spring boot 项目中引入 MongoDB, 使用 MongoTemplate 作为工具;

一. maven 节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    <dependency>
      <groupId>com.spring4all</groupId>
      <artifactId>mongodb-plus-spring-boot-starter</artifactId>
      <version>1.0.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.mongdb</groupId>
      <artifactId>mongo-java-driver</artifactId>
      <version>3.8.1</version>
    </dependency>

 

配置:

yml 中的配置数据库,mongodb 默认的端口是 27017

1
2
3
4
spring:
  data:
    mongodb:
      uri: mongodb://localhost:27017/zs

 

创建类

注意:@Data 是 lombok 工具包的,JSONObject 是 hutool 工具包的

实体类

我模拟的是,点击加钱,生成记录的场景,里面的类型最好是用包装类。

1
2
3
4
5
6
7
8
9
@Data
@Document(collection="AddMoney")
public class AddMoney implements Serializable {
     
    String id;
    Integer type;
    Double money;
    String creattime;
}

 

DAO 类

已经配置过,直接依赖注入。

1
2
3
4
5
6
7
8
9
10
@Repository
public class AddMoneyDao {
  
    /**
     * MongoTemplate
     */
    @Autowired
    private MongoTemplate mongoTemplate;
 
}

 增加一条数据,id 自动生成,返回一个有 id 的对象。

1
2
3
4
5
6
/*
 * 增加一条数据
 */
public AddMoney saveOne(AddMoney param) {
    return mongoTemplate.insert(param);
}

 

查询操作,Query 类型为筛选条件,在查询修改和删除中通用,Criteria 是拼接条件,where().is(),也可以是其他的 lt、lte、gt、gte、ne 等等。

排序或者限制输出行数这些与 where 无关的在 Query 里设置 q.limit()、q.skip()、q.with(Sort.by(Sort.Order.desc(sname)));

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*
 * 根据id查询
 */
public AddMoney findOneById(String id){
    Query q=new Query( Criteria.where("_id").is(id));
    List<AddMoney> list = mongoTemplate.find(q, AddMoney.class);
    if(list.size()==1){
        return list.get(0);
    }else
        return null;
}
  
/*
 * 查询全部
 */
public List<AddMoney> findAll() {
    return mongoTemplate.findAll(AddMoney.class);
}
  
/*
 * 查询全部并排序
 */
public List<AddMoney> findAllSort(String sname) {
    Query q=new Query();
    q.with(Sort.by(Sort.Order.desc(sname)));
    return mongoTemplate.find(q, AddMoney.class);
}

 

修改数据入参由修改内容和条件筛选组成,Update 对象中设置修改内容,筛选条件和查询一样,返回值为改变列数等信息。

注意入参的修改对象属性为 null 就是对应字段不修改,不为 null 就是修改为入参的值,所以要用包装类,否则 int double 这些默认为 0。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*
 * 根据id修改数据
 */
public String updateById(AddMoney params,String id){
    JSONObject json= JSONUtil.parseObj(params);
    Query q=new Query(Criteria.where("_id").is(id));
    Update update = new Update();
    json.forEach((s, o) -> {
        update.set(s,o);
    });
    UpdateResult result=mongoTemplate.updateFirst(q,update,params.getClass());
    return result.toString();
}
  
/*
 * 修改多个
 */
public String update(AddMoney params,int type){
    JSONObject json= JSONUtil.parseObj(params);
    Query q=new Query(Criteria.where("type").is(type));
    Update update = new Update();
    json.forEach((s, o) -> {
        update.set(s,o);
    });
    UpdateResult result=mongoTemplate.updateMulti(q,update,AddMoney.class);
    return result.toString();
}

 删除数据,返回值为删除行数

1
2
3
4
5
6
7
8
/*
* 按id删除
*/
public String deleteById(String id){
    Query q=new Query(Criteria.where("_id").is(id));
    DeleteResult deleteResult=mongoTemplate.remove(q,AddMoney.class);
    return deleteResult.toString();
}

 

调用

写完调用测试一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@Service
public class UserServiceImpl implements UserService {
  
    @Autowired
    AddMoneyDao plusMoneyDao;
  
    @Override
    public AddMoney findOneById(String id) {
        return plusMoneyDao.findOneById(id);
    }
  
    @Override
    public String updateOne(AddMoney a,String id) {
        return plusMoneyDao.updateById(a,id);
    }
  
    @Override
    public String updateByType(AddMoney a, int type) {
        return plusMoneyDao.update(a,type);
    }
  
    @Override
    public String deleteOne(String id) {
        return plusMoneyDao.deleteById(id);
    }
  
    @Override
    public List<AddMoney> findAll() {
        return plusMoneyDao.findAllSort("money");
    }
  
    @Override
    public AddMoney saveOne(AddMoney addMoney) {
        return plusMoneyDao.saveOne(addMoney);
    }
}