mongodb - 如何在mongo spring boot中默认为所有查询添加默认条件
问题描述
我需要软删除给定 MongoDB 集合中的文档。为此,我使用了一个名为已删除的布尔值。所以现在当我从数据库中检索数据时,我必须总是提到将数据放在deleted=false
.
例如:
public Organization findOrgById(String id) {
Query query = new Query();
Criteria criteria = Criteria.where(Constants.ENTITY_ID).is(id)
.and(Constants.DELETED).is(false);
query.addCriteria(criteria);
Organization res = mongoTemplate.findOne(query, Organization.class);
return res;
}
有没有办法指定deleted=false
默认添加的所有条件而不在代码本身中提及它?在 Hibernate 核心中有一个注释@Where
,但它不适用于 mongo 文档。
解决方案
我认为最好的方法是扩展MongoTemplate
将您的deleted=false
条件添加到所有 Find 查询的类。
以下是如何使用一种用于执行findOne
查询的方法的示例:
public class ExtendedMongoTemplate extends MongoTemplate {
private static final Document DELETED_CRITERIA_DOC = Criteria.where(Constants.DELETED).is(false)
.getCriteriaObject();
@Override
protected <T> T doFindOne(
String collectionName,
Document query,
Document fields,
CursorPreparer preparer,
Class<T> entityClass) {
query.putAll(DELETED_CRITERIA_DOC);
return super.doFindOne(collectionName, query, fields, preparer, entityClass);
}
...
}
该方法在方法中被调用doFindOne(Query query, Class<?> entityClass)
(最后一个委托执行
其他覆盖的方法是:
protected <S, T> List<T> doFind(String collectionName, Document query, Document fields,
Class<S> entityClass, CursorPreparer preparer);
protected <T> T doFindAndRemove(String collectionName, Document query, Document fields,
Document sort, @Nullable Collation collation, Class<T> entityClass);
protected <T> T doFindAndModify(String collectionName, Document query, Document fields, Document sort,
Class<T> entityClass, UpdateDefinition update, @Nullable FindAndModifyOptions options);
protected <T> T doFindAndReplace(String collectionName, Document mappedQuery, Document mappedFields,
Document mappedSort, com.mongodb.client.model.Collation collation, Class<?> entityType,
Document replacement, FindAndReplaceOptions options, Class<T> resultType);
这些方法在低级别执行查询,因此它们接受具有查询条件的 BSON 文档,而不是 Spring 的条件。如果您这样做,Find-methods 将为您的所有查询添加附加条件。
您也可以以类似的方式覆盖 methods findOne
、find
等findAndModify
,但是这些方法中有很多都使用doFind*
方法。因此,覆盖doFind*
将导致使用所有查找查询。并且不要忘记覆盖findById
(它也在doFindOne
内部使用)。
顺便说一句,@Where
注解来自 Hibernate,但 Spring Data Mongo 不使用它们。它需要自己的注释才能与您的实体一起使用。
推荐阅读
- angular - Angular 10 - 日期时间选择器和时区
- flutter - 底部导航栏不会更改 Flutter 中按钮按下时的图标
- python - 在python中制作数组的副本
- javascript - 将附加按钮高度与 select2 下拉菜单对齐
- artifactory - 如果 jenkins 声明性管道中已经存在,则跳过 jfrog 中的工件上传
- python - 一种在有条件的情况下循环的方法
- c++ - 当有换行符时,clang-format 删除 if 条件中的缩进
- sql-server - 在触发器上插入日期和时间 6 天
- linux - 如何从每行列出一个字符串的 txt 文件中移动标题内包含字符串的文件
- python - 如何总结列表中的每一秒数