Spring Boot & MongoDB 实现总结

一、引入数据源配置和依赖

<!-- MongoDb -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=Java
spring.jpa.show-sql=true
spring.data.jpa.repositories.enabled=true

logging.level.org.springframework.data.mongodb.core=DEBUG

二、Dao层实现
通过继承MongoRepository可实现简单常用的CURD方法,方法如下:
T为需要返回的类型,ID为主键类型



@NoRepositoryBean
public interface MongoRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
    <S extends T> List<S> saveAll(Iterable<S> var1);

    List<T> findAll();

    List<T> findAll(Sort var1);

    <S extends T> S insert(S var1);

    <S extends T> List<S> insert(Iterable<S> var1);

    <S extends T> List<S> findAll(Example<S> var1);

    <S extends T> List<S> findAll(Example<S> var1, Sort var2);
}

三、定义文档对象


packNum com.study.demo.entity;

import com.study.demo.utils.UuidUtil;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

import java.io.Serializable;
import java.util.Date;

@Data
@Document(collection = "WIKI")
public class WikiInfo implements Serializable{

    private static final long serialVersionUID = 4565375579357105655L;

    @Id
    @Field("ID")
    private String id = UuidUtil.getId();

    @Field("TITLE")
    private String title;

    @Field("AUTHOR")
    private String author;

    @Field("URL")
    private String url;

    @Field("PUBLISH_TIME")
    private Date publishTime;

    @Field("CREATE_TIME")
    private Date createTime = new Date();

}

四、复杂查询简单实现

对于复杂的一些条件,可以自定义方法(按照命名规范)或者自定义SQL(注解,Query等),例如下列定义的四个方法,通过属性+关键字+参数构造特殊方法
如:findByTitleLike 查询以findBy开头,意为通过什么查找,后接需要的属性名Title表示通过标题条件查找,后接Like,sql里为模糊匹配的意思,即按照Title字段值模糊匹配查询所有满足条件的信息。
参数列表:String title即为需要注入的值,如果需要分页,则增加参数PNumable,即可实现分页效果。
通过实现类PNumRequest构造PNumable对象:
PNumable pNumable = PNumRequest.of(pNum,size);
如果需要多个查询条件,可以用And、Or等关键字连接(如方法四,主要关键字见后文)


packNum com.study.demo.dao;

import com.study.demo.entity.WikiInfo;
import org.springframework.data.domain.PNumable;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;

@Repository
public interface WikiInfoDao extends MongoRepository<WikiInfo, String> {

    /** 查询输入时间之前的数据 */
    List<WikiInfo> findByCreateTimeBefore(Date createTime);

    /** 查询所有信息通过标题模糊匹配 */
    List<WikiInfo> findByTitleLike(String title);

    /** 查询所有信息通过标题模糊匹配,分页查询 */
    List<WikiInfo> findByTitleLike(String title, PNumable pNumable);

    /** 查询输入所有作者ID在输入时间后的数据 */
    List<WikiInfo> findByIdInAndCreateTimeAfter(List<String> ids, Date createTime);
}

通过Controller简单访问,可查看结果和SQL 如:

2020-01-20 12:03:38.251 DEBUG 10848 --- [nio-9090-exec-5] o.s.data.mongodb.core.MongoTemplate      : find using query: { "TITLE" : { "$regex" : "Java", "$options" : "" } } fields: Document{{}} for class: class com.study.demo.entity.WikiInfo in collection: WIKI
2020-01-20 12:04:06.055 DEBUG 10848 --- [nio-9090-exec-3] o.s.data.mongodb.core.MongoTemplate      : find using query: { "_id" : { "$in" : ["58077516d06c40278c1ede771b4d3f9c", "15fb39d7f5ea4dd3a07c0b69e006384b"] }, "CREATE_TIME" : { "$gt" : { "$date" : 1578975086000 } } } fields: Document{{}} for class: class com.study.demo.entity.WikiInfo in collection: WIKI

五、相关关键字

KeyWord sample logical result
After(在某时间之后) findByCreateTimeAfter {“CreateTime”:{"$gt":createTime}}
Before(在某时间之前) findByCreateTimeBefore {“CreateTime”:{"$lt":createTime}}
GreaterThan(大于) findByNumGreaterThan(int Num) {“Num” : {"$gt" : Num}}
LessThan(小于) findByNumLessThan(int Num) {“Num” : {"$lt" : Num}}
Between(在…之间) findByNumBetween(int from, int to) {“Num” : {“ g t " : f r o m , " gt" : from, " lt” : to}}
IsNotNull, NotNull(是否非空) findByTitleNotNull() {“Num” : {"$ne" : null}}
IsNull, Null(是否为空) findByTitleNull() {“Num” : null}
Like(模糊查询) findByTitleLike(String name) {“Num” : Num} ( Num as regex)
(No keyword) findByTitle(String name) {“Num” : name}
Not(不包含) findByTitleNot(String name) {“Num” : {"$ne" : name}}
Near(查询地理位置相近的) findByLocationNear(Point point) {“location” : {"$near" : [x,y]}}
Within(在地理位置范围内的) findByLocationWithin(Circle circle) {“location” : {“KaTeX parse error: Expected '}', got 'EOF' at end of input: within" : {"center” : [ [x, y], distance]}}}
Within(在地理位置范围内的) findByLocationWithin(Box box) {“location” : {“KaTeX parse error: Expected '}', got 'EOF' at end of input: within" : {"box” : [ [x1, y1], x2, y2]}}}
Regex findByTitleRegex(String title) {“TITLE”:{"$regex":title}}
发布了40 篇原创文章 · 获赞 31 · 访问量 62万+

猜你喜欢

转载自blog.csdn.net/weixin_38422258/article/details/104052007