springboot mongoTemplate多条件查询,区间查询,表名查询,排序

本文介绍了一种使用MongoDBTemplate进行时间区间查询的方法,并展示了如何实现排序、返回指定字段及指定表名查询等功能。通过具体示例代码,读者可以了解到如何构建查询条件并执行查询。

mongodbTemplate实现时间区间查询、排序、返回指定字段、指定表名查询

@Autowired
private MongoTemplate mongoTemplate;

@Override
public ResultData rawDataQueryMethod(QueryDataCurrencyParamDTO queryDataCurrencyParamDTO) {

    List<DBObject> andCondi = new ArrayList<DBObject>();
    DBObject userIdObject = new BasicDBObject();
    if(null!=queryDataCurrencyParamDTO.getUser_id() && !queryDataCurrencyParamDTO.getUser_id().equals("")){
        userIdObject.put("user_id",queryDataCurrencyParamDTO.getUser_id());
        andCondi.add(userIdObject);
    }
    DBObject gadgetIdObject = new BasicDBObject();
    if(null!=queryDataCurrencyParamDTO.getGadget_id() && !queryDataCurrencyParamDTO.getGadget_id().equals("")){
        gadgetIdObject.put("gadget_id",queryDataCurrencyParamDTO.getGadget_id());
        andCondi.add(gadgetIdObject);
    }
    DBObject gadgetTypeIdObject = new BasicDBObject();
    if(null!=queryDataCurrencyParamDTO.getGadget_type_id() && !queryDataCurrencyParamDTO.getGadget_type_id().equals("")){
        gadgetTypeIdObject.put("gadget_type_id",queryDataCurrencyParamDTO.getGadget_type_id());
        andCondi.add(gadgetTypeIdObject);
    }

    DBObject timeObject = new BasicDBObject();
    if(null!=queryDataCurrencyParamDTO.getStart_time() && !queryDataCurrencyParamDTO.getStart_time().equals("")){
        timeObject.put("$gte",Long.valueOf(queryDataCurrencyParamDTO.getStart_time()));
    }
    if(null!=queryDataCurrencyParamDTO.getEnd_time() && !queryDataCurrencyParamDTO.getEnd_time().equals("")){
        timeObject.put("$lte",Long.valueOf(queryDataCurrencyParamDTO.getEnd_time()));
    }
    if(timeObject.keySet().size()>0){
        DBObject timeCompare = new BasicDBObject();
        timeCompare.put("time",timeObject);
        andCondi.add(timeCompare);
    }

    BasicDBObject andQuery = new BasicDBObject();
    andQuery.put("$and", andCondi);

    DBObject fieldsObject = new BasicDBObject();
    fieldsObject.put("time", true);
    fieldsObject.put("value", true);
    Query query = new BasicQuery(andQuery,fieldsObject);
    query.with(new Sort(new Sort.Order(Sort.Direction.DESC, "time")));
    System.out.println(query.toString());

    try {
          List<AvgData> rawDataList = mongoTemplate.find(query,AvgData.class,"declad_log_data");
        if(null!=rawDataList && rawDataList.size()>0){
            return ResultData.ok(rawDataList);
        }else {
            return ResultData.ok(rawDataList);
        }
    }catch (Exception e){
        e.printStackTrace();
        return ResultData.error();
    }
}

 

 

Criteria criteria = new Criteria();

if(null!=queryDataCurrencyParamDTO.getUser_id() && !queryDataCurrencyParamDTO.getUser_id().equals("")){
    criteria.and("user_id").is(queryDataCurrencyParamDTO.getUser_id());
}
if(null!=queryDataCurrencyParamDTO.getGadget_id() && !queryDataCurrencyParamDTO.getGadget_id().equals("")){
    criteria.and("gadget_id").is(queryDataCurrencyParamDTO.getGadget_id());
}
if(null!=queryDataCurrencyParamDTO.getGadget_type_id() && !queryDataCurrencyParamDTO.getGadget_type_id().equals("")){
    criteria.and("gadget_type_id").is(queryDataCurrencyParamDTO.getGadget_type_id());
}

boolean timeFlag=false;
Criteria timeCriteria = Criteria.where("time");
if(null!=queryDataCurrencyParamDTO.getStart_time() && !queryDataCurrencyParamDTO.getStart_time().equals("")){
    timeFlag=true;
    timeCriteria.gte(Long.valueOf(queryDataCurrencyParamDTO.getStart_time()));
}
if(null!=queryDataCurrencyParamDTO.getEnd_time() && !queryDataCurrencyParamDTO.getEnd_time().equals("")){
    timeFlag=true;
    timeCriteria.lte(Long.valueOf(queryDataCurrencyParamDTO.getEnd_time()));
}
if(timeFlag){
    criteria.andOperator(timeCriteria);
}

Query query = new Query(criteria);
Field fields  = query.fields();
fields.include("time");
fields.include("value");
query.with(new Sort(new Sort.Order(Sort.Direction.DESC, "time")));
在使用 Lambda 达式实现区间查询功能时,通常结合数据结构(如数组、向量)以及算法(如 `std::copy_if`、`std::transform`、`std::find_if`)来实现筛选和过滤。以下是一个完整的实现方法,展示了如何使用 Lambda 达式进行区间查询。 ### 示例:使用 Lambda 达式实现区间查询 假设有一个 `std::vector<int>` 存储了一组整数数据,需要查询其中位于 `[min_value, max_value]` 区间内的所有元素。 ```cpp #include <iostream> #include <vector> #include <algorithm> #include <iterator> int main() { std::vector<int> data = {10, 25, 30, 15, 5, 20, 35, 18}; int min_value = 15; int max_value = 25; // 创建一个结果容器存储查询结果 std::vector<int> result; // 使用 Lambda 达式实现区间查询 std::copy_if(data.begin(), data.end(), std::back_inserter(result), [min_value, max_value](int value) { return value >= min_value && value <= max_value; }); // 输出查询结果 std::cout << "区间 [" << min_value << ", " << max_value << "] 内的元素有: "; for (int value : result) { std::cout << value << " "; } std::cout << std::endl; return 0; } ``` ### 代码说明 - **`std::copy_if`**:这是标准库算法,用于复制满足特定条件的元素。 - **Lambda 达式**:定义了一个匿函数,用于检查每个元素是否在指定区间内。 - 捕获列 `[min_value, max_value]`:将外部变量 `min_value` 和 `max_value` 传递给 Lambda 达式。 - 函数体 `return value >= min_value && value <= max_value;`:判断当前元素是否在指定区间内。 - **`std::back_inserter(result)`**:用于将符合条件的元素插入到 `result` 容器中。 ### 输出结果 ``` 区间 [15, 25] 内的元素有: 25 15 20 18 ``` ### 扩展功能 如果需要对查询结果进行进一步处理(例如排序或去重),可以在 `std::copy_if` 之后使用其他算法,如 `std::sort` 或 `std::unique`。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值