安装
拉取镜像
dokcer pull mogo
创建容器
docker run -di --name mongo-service --restart=always -p 27017:27017 -v ~/data/mongodata:/data mongo
项目集成
导入依赖
org.springframework.boot
spring-boot-starter-data-mongodb
修改application
server:
port: 9998
spring:
data:
mongodb:
host: 192.168.200.130
port: 27017
database: leadnews-history
创建实体类
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
import java.util.Date;
/**
*
* 联想词表
*
*
*/
@Data
@Document("ap_associate_words")
public class ApAssociateWords implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
/**
* 联想词
*/
private String associateWords;
/**
* 创建时间
*/
private Date createdTime;
}
测试类
import com.itheima.mongo.MongoApplication;
import com.itheima.mongo.pojo.ApAssociateWords;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
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.test.context.junit4.SpringRunner;
import java.util.Date;
import java.util.List;
@SpringBootTest(classes = MongoApplication.class)
@RunWith(SpringRunner.class)
public class MongoTest {
@Autowired
private MongoTemplate mongoTemplate;
//保存
@Test
public void saveTest(){
/*for (int i = 0; i < 10; i++) {
ApAssociateWords apAssociateWords = new ApAssociateWords();
apAssociateWords.setAssociateWords("黑马头条");
apAssociateWords.setCreatedTime(new Date());
mongoTemplate.save(apAssociateWords);
}*/
ApAssociateWords apAssociateWords = new ApAssociateWords();
apAssociateWords.setAssociateWords("黑马直播");
apAssociateWords.setCreatedTime(new Date());
mongoTemplate.save(apAssociateWords);
}
//查询一个
@Test
public void saveFindOne(){
ApAssociateWords apAssociateWords = mongoTemplate.findById("60bd973eb0c1d430a71a7928", ApAssociateWords.class);
System.out.println(apAssociateWords);
}
//条件查询
@Test
public void testQuery(){
Query query = Query.query(Criteria.where("associateWords").is("黑马头条"))
.with(Sort.by(Sort.Direction.DESC,"createdTime"));
List apAssociateWordsList = mongoTemplate.find(query, ApAssociateWords.class);
System.out.println(apAssociateWordsList);
}
@Test
public void testDel(){
mongoTemplate.remove(Query.query(Criteria.where("associateWords").is("黑马头条")),ApAssociateWords.class);
}
}
saveTest
方法运行之后,
会根据spring.data.mongodb.database
: leadnews-history 建立数据库
根据@Document("ap_associate_words")
作为表名
以及实体类中的id,associateWords,createdTime
作为表的列
核心方法
保存或者修改
mongoTemplate.save(apAssociateWords);
查询一个对象
=
ApAssociateWords apAssociateWords = mongoTemplate.findById("60bd973eb0c1d430a71a7928", ApAssociateWords.class);
多条件查询
Query query = Query
.query(Criteria.where("associateWords")
.is("黑马头条"))
.with(Sort
.by(Sort.Direction.DESC,"createdTime"));
List apAssociateWordsList = mongoTemplate.find(query, ApAssociateWords.class);
删除
mongoTemplate
.remove(Query.query(Criteria.where("associateWords")
.is("黑马头条"))
,ApAssociateWords.class);
MongoRepository
创建评论dto
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
/**
* 文章评论实体类
*/
//把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档。
//@Document(collection="mongodb 对应 collection 名")
// 若未加 @Document ,该 bean save 到 mongo 的 comment collection
// 若添加 @Document ,则 save 到 comment collection
@Document(collection="comment")//可以省略,如果省略,则默认使用类名小写映射集合
//复合索引
@CompoundIndex( def = "{'userid': 1, 'nickname': -1}")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class Comment implements Serializable {
//主键标识,该属性的值会自动对应mongodb的主键字段"_id",如果该属性名就叫“id”,则该注解可以省略,否则必须写
@Id
private String id;//主键
//该属性对应mongodb的字段的名字,如果一致,则无需该注解
@Field("content")
private String content;//吐槽内容
private Date publishtime;//发布日期
//添加了一个单字段的索引
@Indexed
private String userid;//发布人ID
private String nickname;//昵称
private LocalDateTime createdatetime;//评论的日期时间
private Integer likenum;//点赞数
private Integer replynum;//回复数
private String state;//状态
private String parentid;//上级ID
private String articleid;
}
创建Repository
import com.example.mongodb2.po.Comment;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;
/**
* @author 飞宇千虹
* @date 2023-07-12 14:16
*/
public interface CommentRepository extends MongoRepository {
Page findByParentid(String parentId, Pageable pageable);
}
调用CommentRepository方法
import com.example.mongodb2.dto.CommentRepository;
import com.example.mongodb2.po.Comment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
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.stereotype.Service;
import java.util.List;
/**
* @author 飞宇千虹
* @date 2023-07-12 14:17
*/
@Service
public class CommentService {
@Autowired
private CommentRepository commentRepository;
/**
* 保存一个评论
* @param comment
*/
public void saveComment(Comment comment){
//如果需要自定义主键,可以在这里指定主键;如果不指定主键,MongoDB会自动生成主键
//设置一些默认初始值。。。
//调用dao
commentRepository.save(comment);
}
/**
* 更新评论
* @param comment
*/
public void updateComment(Comment comment){
//调用dao
commentRepository.save(comment);
}
/**
* 根据id删除评论
* @param id
*/
public void deleteCommentById(String id){
//调用dao
commentRepository.deleteById(id);
}
/**
* 查询所有评论
* @return
*/
public List findCommentList(){
//调用dao
return commentRepository.findAll();
}
/**
* 根据id查询评论
* @param id
* @return
*/
public Comment findCommentById(String id){
//调用dao
return commentRepository.findById(id).get();
}
public Page findByParentId(String parentId,int page ,int size){
return commentRepository.findByParentid(parentId,PageRequest.of(page-1,size));
}
@Autowired
private MongoTemplate mongoTemplate;
public void updateCommentLikenum(String id){
// 查询条件
Query query = Query.query(Criteria.where("_id").is(id));
// 更新条件
Update update = new Update();
update.inc("likenum");
mongoTemplate.updateFirst(query,update,Comment.class);
}
}
方法测试
import com.example.mongodb2.po.Comment;
import com.example.mongodb2.service.CommentService;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
class Mongodb2ApplicationTests {
@Autowired
private CommentService commentService;
@Autowired
private MongoTemplate mongoTemplate;
@Test
void contextLoads() {
List commentList = commentService.findCommentList();
System.out.println(commentList);
}
@Test
void getOne() {
Comment commentById = commentService.findCommentById("1");
System.out.println(commentById);
}
@Test
void page() {
Page page = commentService.findByParentId("3", 1, 2);
System.out.println(page.getTotalPages());
System.out.println(page.getContent());
}
@Test
void updateCommentLikenum() {
commentService.updateCommentLikenum("1");
}
}
查询评论列表
@Test
void contextLoads() {
List commentList = commentService.findCommentList();
System.out.println(commentList);
}
根据id查询评论信息
@Test
void getOne() {
Comment commentById = commentService.findCommentById("1");
System.out.println(commentById);
}
查询分页信息
@Test
void page() {
Page page = commentService.findByParentId("3", 1, 2);
System.out.println(page.getTotalPages());
System.out.println(page.getContent());
}
为指定id的评论添加点赞
@Test
void updateCommentLikenum() {
commentService.updateCommentLikenum("1");
}
方法执行前
方法执行后