网站正在建设中 打不开怎么办,网站建设用图片,网站建设工作情况总结,成都户外网站建设需求
为方便使用人员对任务Task的搜索#xff0c;需要根据number实现模糊搜索。
背景
之前设计的number是long类型#xff0c;但是mongodb只支持string类型的正则匹配。
方案
修改number为string类型#xff1b;新增一个冗余字段#xff0c;用于模糊查询#xff1b;在…需求
为方便使用人员对任务Task的搜索需要根据number实现模糊搜索。
背景
之前设计的number是long类型但是mongodb只支持string类型的正则匹配。
方案
修改number为string类型新增一个冗余字段用于模糊查询在查询地时候转换为string类型
第一个方案的问题在于其他系统设计的也是long类型如果修改为string类型了那么系统之间的类型就不统一了。并且在查询其他系统时需要转换类型比较麻烦。还有一个缺点是修改的影响范围比较大所有出现的地方都需要更改。
第二个方案就是这样设计显得太过多余会增加数据存储且不好维护。
于是最后选择了第三个方案。
实现
为了使用mongoTemplate的分页和动态查询的功能还需要兼容模糊number的功能。这里采取了一个折中的方案。
既先用模糊number的方法查询出所有Task的ids然后在添加到条件中进行二次过滤。虽然这样有一点性能的损耗但是在代码的实现难度上下降了很多并且可以复用之前的查询代码。如果这里是性能瓶颈最后可以优化但是目前看没有问题。
具体实现如下
1. 这里通过mongoTemplate执行mongo的aggregate命令$toString: $number将number转换为string。isDeleted : { $ne : true }这是查询的另一个条件可以根据实际情况取舍。返回游标cursor进行数据的读取。 private ListString numberRegexMatch(Long number) {if (number null) return null;String command { aggregate: \col_task\, pipeline: [ { \$match\: { \$expr\: { \$regexMatch\: { \input\: { \$toString\: \$number\ }, \regex\: \%s\ } }, \$and\:[{ \isDeleted\ : { \$ne\ : true } }] } } ], cursor: { \batchSize\: 10 } };Document document mongoTemplate.executeCommand(String.format(command, number));Document cursor (Document) document.get(cursor);ListDocument firstBatch (ListDocument) cursor.get(firstBatch);if (CollectionUtils.isEmpty(firstBatch))throw LogicalException.newInstance(LogicError.TASK_NOT_EXIST);return firstBatch.stream().map(e - e.get(_id).toString()).collect(Collectors.toList());} 2. 将获取的ids设置到TaskCriteria中然后调用之前的TaskRepository search方法动态查询返回分页数据。
MongoLambdaQuery是我封装的一个动态查询插件详细可以参考博客
基于lambda的mongodb查询插件_张家老院子的博客-CSDN博客 public PageResultAssetDTO search(TaskCriteria taskCriteria) {try {taskCriteria.setIds(numberRegexMatch(taskCriteria.getNumber()));} catch (LogicalException e) {return new PageResult();}return new PageResult(taskRepository.search(taskCriteria).map(TaskDTO::newInstance));}Repository
public interface TaskRepository extends MongoRepositoryTask, String {default PageTask search(TaskCriteria taskCriteria) {return MongoLambdaQuery.lambdaQuery(Task.class).like(Task::getNumber, taskCriteria.getNumber()).is(Task::getStatus, taskCriteria.getStatus()).in(Task::getAreaId, taskCriteria.getAreaIds()).is(Task::getModel, taskCriteria.getModel()).ne(Task::getIsDeleted, Boolean.TRUE).in(Task::getId, taskCriteria.getIds()).page(taskCriteria.getPagination());}
}