Springboot操作mongodb的两种方法:MongoTemplate和MongoRepository
导包:
org.springframework.boot:spring-boot-starter-data-mongodb:2.6.7
org.springframework.boot:spring-boot-starter-validation:2.6.7
框架中使用jpa mongodb,这里记录两种方法操作mongodb,一个是使用mongoTemplate:
实体类:
public abstract class BaseDocument {
@CreatedDate public Date createDate = new Date();
@CreatedBy public String createdBy;
@LastModifiedDate public Date lastModifiedDate = new Date();
@LastModifiedBy public String lastModifiedBy;
}
@EqualsAndHashCode(callSuper = true)
@Document
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Slf4j
public class Event extends BaseDocument {
@MongoId(value = FieldType.OBJECT_ID)
private String id;
@Indexed private String hostId;
@Pattern(regexp = "^$|^.{4,255}$", message = "title must be in 5~255 characters")
private String title;
@Pattern(regexp = "^$|^[\\w\\W]{4,12225}$", message = "description must be in 5~12225 characters")
private String description;
}
使用mongoRepository的方法:
public interface EventRepository extends MongoRepository<Event, String>, EventRepositoryCustom {
Optional<Event> findById(String eventId);
void removeById(String eventId);
}
如果是一些复杂的情况如聚合,则需要自己写聚合语句:
例如:
@Aggregation(
pipeline = {
" {\n"
" $match: {hostId: \"?0\", status: {$in: ['STARTED','APPROVED']}}},\n"
" },",
" {\n"
" $addFields: {\n"
" statusIndex: {\n"
" $cond: [\n"
" { $eq: [\"$event.status\", \"STARTED\"] },\n"
" 0,\n"
" {\n"
" $cond: [{$or: [{ $eq: [\"$event.status\","
" \"COMMITTED\"] },{ $eq: [\"$event.status\", \"REVIEWING\"] }]}, 1, \n"
" {$cond: [{ $eq: [\"$event.status\","
" \"APPROVED\"] }, 2, 3]}\n"
" ],\n"
" },\n"
" ]\n"
" }\n"
" \n"
" }\n"
" },",
" {\n"
" $sort: {\n"
" statusIndex: 1,\n"
" actualEndDate: -1,\n"
" planStartDate: -1\n"
" }\n"
" },",
" {\n" " $skip: ?1\n" " },",
" {\n" " $limit: ?2\n" " },"
})
List<Event> findByHostIdOrderCustom(String hostId, Integer skip, Integer limit);
关于聚合:
文档进入多阶段管道,将文档转换为聚合结果。例如:
在这个例子中:
db.orders.aggregate([
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])
第一阶段:$match阶段按status字段过滤文档,并将status等于"A"的文档传递到下一阶段。
第二阶段:$group阶段按cust_id字段将文档分组,以计算每个唯一值cust_id的金额总和。
最基本的管道阶段提供_过滤器_,其操作类似于查询和修改输出文档格式的_文档转换_。
使用mongoTemplate:
@Override
public Long deleteReplyById(String commentId, String replyId, String userId) {
Query query =
Query.query(Criteria.where("replies.id").is(replyId))
.addCriteria(Criteria.where("id").is(commentId));
Update update =
new Update().set("replies.$.deleteDate", new Date()).set("replies.$.deleteBy", userId);
UpdateResult result = mongoTemplate.updateFirst(query, update, EventComment.class);
return result.getModifiedCount();
}
其他的一些数据库操作:
User user = new User();
user.setId("12345");
user.setName("admin");
user.setAddress("测试");
Query query = Query.query(Criteria.where("_id").is("5d1312aeb1829c279c6c256b"));
Update update = Update.update("name","zs");
// 更新一条数据
mongoTemplate.updateFirst(query,update, User.class);
mongoTemplate.updateFirst(query,update, "mongodb_user");
mongoTemplate.updateFirst(query,update, User.class,"mongodb_user");
// 更新多条数据
mongoTemplate.updateMulti(query,update, User.class);
mongoTemplate.updateMulti(query,update,"mongodb_user");
mongoTemplate.updateMulti(query,update, User.class,"mongodb_user");
// 更新数据,如果数据不存在就新增
mongoTemplate.upsert(query,update, User.class);
mongoTemplate.upsert(query,update,"mongodb_user");
mongoTemplate.upsert(query,update, User.class,"mongodb_user");
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgachjb
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13