一、新建实体类
1、新建评论类
package com.hq.mongodb.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.Date;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class Comment {
private Integer id;
private String content;
private String grage;
private String userId;
private Date createTime;
private List<Reply> replyList;
}
2、新建回复类
package com.hq.mongodb.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class Reply {
@Id
private String id;
/**
* 回复id
*/
private String replyId;
/**
* 评论id
*/
private String commentId;
/**
* 回复内容
*/
private String content;
/**
* 用户id
*/
private Integer userId;
/**
* 创建时间
*/
private String createTime;
}
二、crud
1、添加
Comment comment = mongoTemplate.findById("621f89cb80c07d03b92835ce", Comment.class);
List<Reply> list = new ArrayList<>();
if (comment.getReplyList() != null) {
list = comment.getReplyList();
}
Reply reply = new Reply();
reply.setContent("回复内容");
reply.setId(System.currentTimeMillis()+"");
list.add(reply);
comment.setReplyList(list);
mongoTemplate.save(comment, "comment");
2、删除
Update update = new Update();
//需要删除的数据
update.pull("replyList",new BasicDBObject("_id","1647572876015"));
//先根据条件查询到父集合对应的数据,再根据对应集合属性的键进行查找
Query query = new Query(Criteria.where("_id").is("621f89cb80c07d03b92835ce").and("replyList.id").is("1647572876015"));
//执行
UpdateResult result = mongoTemplate.updateMulti(query, update, Comment.class, "comment");
3、修改
Update update = new Update();
//需要修改的值(键名必须是子集合的key.$.需要修改的key)
update.set("replyList.$.content", "ss");
//先查询出对应的父集合,然后根据对应子集合条件查询
Query query = new Query(Criteria.where("userId").is(1).and("replyList").elemMatch(Criteria.where("id").is("1647572876015")));
UpdateResult result = mongoTemplate.updateMulti(query, update, Comment.class, "comment");
System.out.println(result.getModifiedCount());
4、查询
Aggregation aggregation=Aggregation.newAggregation(
//先查询父集合
Aggregation.match(Criteria.where("_id").is("621f89cb80c07d03b92835ce")),
//拆分子集合字段
Aggregation.unwind("replyList"),
//再根据子集合条件进行查询
Aggregation.match(Criteria.
where("replyList.content").is("回复内容"))
);
//执行查询,泛型只能是JSONObject
AggregationResults<JSONObject> reminds = mongoTemplate
.aggregate(aggregation, "comment", JSONObject.class);
List<JSONObject> mappedResults = reminds.getMappedResults();
List<Reply> list=new ArrayList<>();
if(mappedResults!=null&&mappedResults.size()!=0){
//依次添加
for (JSONObject mappedResult : mappedResults) {
list.add(JSONObject.parseObject(mappedResult.getJSONObject("replyList").toJSONString(),Reply.class));
}
}