当前位置:网站首页>记录一次Mongotemplate的And和Or的各种套

记录一次Mongotemplate的And和Or的各种套

2022-06-24 12:58:00 人形bug制造机9527

需求是查询用户的行程安排信息
查询用户过去七天到未来的行程安排,
也就是说数据必须满足如下条件
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 > 当前时间减7and
(
	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,但是上层有其他的嵌套,则加入他们的判断;

原网站

版权声明
本文为[人形bug制造机9527]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_49194578/article/details/125410495