引言

应用程序中,通常会使用两种数据库,一种是关系型数据库如mysql等,另一种则是非关系型数据库例如mongodb,今天我们就来讲一讲如何在springboot中使用mongodb。

依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

配置文件

这里配置的单点

spring:
  data:
    mongodb:
      username: calculate
      password: 1234calculate
      host: 120.79.128.190
      port: 27017
      database: data_db

代码编写

1、实体类

这里新建了一个新闻类的实体来做出说明

@Data
@Document(value = "test")
public class NewsMg {

	@Id
	private String id;
	
    /**
     * 标题
     */
    @Field(value = "title")
    private String title;

    /**
     * 分类
     */
    @Field(value = "news_type")
    private String type;

    /**
     * 描述
     */
    @Field(value = "abstract")
    private String describe;

    /**
     * 链接
     */
    @Field(value = "link")
    private String link;

    /**
     * 来源
     */
    @Field(value = "source")
    private String source;

    /**
     * 作者
     */
    @Field(value = "author")
    private String author;

    /**
     * 发表时间
     */
    @Field(value = "date")
    private Long resourceTime;

    /**
     * 重要性
     */
    @Field(value = "importance")
    private String importance;
}
  1. @Document注解
    这是第一个核心注解,mongodb中我们不是以表来指明,而是以文档,而这个注解最核心的就是collection或者是value,例如 @Document(value = “news”),这里注解在实体类上,表示将此实体类标注为文档类型,并且文档名为news,当然也可以不用使用这个文档名,后续会讲解
  2. @Field(value = “vol”)
    这个和@TableField一样,指定是一个字段
  3. @Id
    这个注解会指定mongodb的id,插入文档时会自动生成这个id
  4. 无需注意字段的类型,这里通过springboot会自动把字段映射到我们的实体上

2、使用repository查询

我们只需要继承接口MongoRepository<T,ID>接口即可

/**
 * 使用注解@Repository
 * 继承后实体类和主键类型
 */
@Repository
public interface newsRepository extents MongoRepository<NewsMg,String>{
	
	/**
	 * 通过id列表查找所有
	 */
	List<NewsMg> getAllByIdIn(List<String> ids);
	
	/**
	 * 通过id查找
	 */
	NewsMg findById(String id);
}

这里可以使用很多,例如 findByXXInORYY(List XX, String YY),可以通过OR和AND连接条件,当然也可以使用注解 @Aggregation(pipeline={})直接写查询语句来实现复杂的查询
但是复杂查询也可以通过下面方式进行查询

3、使用MongoTemplate查询

相比上一个查询,这里的查询操作就稍微显得繁琐一点了

	/**
	 * 注入bean 
	 */
	 @Resource
	 private MongoTemplate mongoTemplate;
	 
	 public List<RealtimeOrder> queryAfter(Long time) {
	 	// 表名,也可以不用指定
        String tableName = "table_name";
		// 构造查询条件,这里where是字段名,后续可以跟is/gt/lt等全等比较条件
		// 如果还有字段,可以使用and(字段名)或者or(字段名)继续追加条件
		Criteria criteria = Criteria.where("字段名").gte(time);
		// 构造Query
		Query query = Query.query(criteria);
		// 这里query还可以追加排序等操作
		// 例如 query.with(Sort.by(Sort.Order.desc("date")))
		// limit, query.limit(查询条数)
		// query.addCriteria() 再次追加查询条件

		// 查询 使用mongoTemplate的方法
		// 查询所有
		mongoTemplate.find(Query.query(criteria), NewsMg.class, tableName);
		// 不指定表名则直接查询实体类注解Document中的集合名,这里就是 test
		mongoTemplate.find(Query.query(criteria), NewsMg.class);
       	// 还有 findOne、findAll、count等方法,能够满足我们最基本的查询
    }


12-29 10:31