需求是查询用户的行程安排信息
查询用户过去七天到未来的行程安排,
也就是说数据必须满足如下条件
1.见面时间 >= 当前时间-7天
2.用户id=发送者id,且发送人确认情况=0或者=null
或者用户id=接收者,且发送人确认情况=0或者=null
以上两个表示用户没有确认或者否认这个记录,所以进行展示
3.行程必须是被同意过的
4.行程必须是未见面的
5.指定用户
mysql大概的写法
select
*
from table
where
isConsent = 1
and
isMeet = 0
and
userId = xxxxxxxxx
and meetime > 当前时间减7天
and
(
userId = recId and (recConfirm = 0 or recConfirm = null)
or
userId = senId and (senConfirm = 0 or recConfirm = null)
)
用mongoTemplate的写法
/**
* 查询用户所有有效的未取消的见面行程,并按见面时间升序ASC
*
* @param userId
* @return
*/
@Override
public PageResult<Meeting> getMeetingSchedule(Integer page, Integer limit, Long userId) {
LocalDateTime min = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
Long sevenDaysAgo = AdTimeUtils.getMills(min.plusDays(-7));
// 创建条件
Criteria criteria = new Criteria();
// 启用or运算符,之中只要一条满足就为true则命中
criteria.orOperator(
// 满足条件1
Criteria.where("sendUserId").is(userId)
// 满足条件1的情况下启用or运算符,其中只要一条满足即为true,配合上面的where即为更上层的true
.orOperator(
Criteria.where("senderConfirm").is(MeetingEnum.UN_MEET.getCode()),
Criteria.where("senderConfirm").is(null)
)
,
Criteria.where("recUserId").is(userId)
.orOperator(
Criteria.where("recipientConfirm").is(MeetingEnum.UN_MEET.getCode()),
Criteria.where("recipientConfirm").is(null)
)
);
// 启用and运算符,其中条件都满足即为选中
criteria.andOperator(
Criteria.where("isConsent").is(MeetingEnum.IS_CONSENT.getCode()),
Criteria.where("isMeet").is(MeetingEnum.UN_MEET.getCode()),
Criteria.where("meetTime").gte(sevenDaysAgo)
);
Query query = new Query(criteria);
query.skip((page - 1) * limit).limit(limit)
.with(Sort.by(Sort.Order.asc("meetTime")));
List<Meeting> meetings = mongoTemplate.find(query, Meeting.class);
if (CollUtil.isEmpty(meetings)) {
return new PageResult<>(
false,
CodeEnum.NO_SCHEDULE.getCode());
}
//到这就是查到了需要的行程数据,封装返回
return new PageResult<>(true, page, limit,
CodeEnum.SELECT_SUCCESS.getCode(), meetings);
}
orOperator
以及andOperator
都相当于开启了一个and (判断)
当里面的||
或者&&
满足时这个为true
,则命中,嵌套的情况下亦是如此,整体如果判断为true
,但是上层有其他的嵌套,则加入他们的判断;