Java中处理Mongodb实例

最近项目中用到Mongodb,遇到问题在网上查找发现很多都写的很模糊,本文用来记录我已使用过的Mongodb实例,后续有新的实例会补充进来。

首先说明,我使用 spring-data 的 MongoTemplate 来操作 Mongodb 的,操作很简单,就是将MongoTemplate注入到项目中,使用里面的API操作就行了,这个不用多说,真正麻烦的是如何拼接Query这个条件。

Query:用来封装所有条件对象

Criteria:用来构建条件

查看了Criteria的API源码,这个对象有下图这些方法:

对应关系(与mongodb的操作符对应):

mongodb操作符官方文档:https://docs.mongodb.com/manual/reference/operator/update/

基本操作符如下图:

使用场景:

1、查询 user 表中字段 _id 为 1 的数据

Query query = new Query();
query.addCriteria(Criteria.where("_id").is(1));
List<User> users = mongoTemplate.find(query, User.class, "user");

2、查询 user 表中字段 name 包含 张;班级 为 5 的数据

Query query = new Query();
Criteria criteria = new Criteria();
criteria.and("name").regex(Pattern.compile("^.*张.*$", Pattern.CASE_INSENSITIVE));
criteria.and("classNum").is(5);
query.addCriteria(criteria);
List<User> users = mongoTemplate.find(query, User.class, "user");

3、查询 USER 表中字段 achievement 中的子集合中的 curriculum 为 数学;fraction 大于 60的数据

Query query = new Query();
Criteria criteria = Criteria.where("achievement").elemMatch(
        Criteria.where("curriculum").is("数学").and("fraction").gt(60)
);
query.addCriteria(criteria);
List<User> users = mongoTemplate.find(query, User.class, "user");

4、聚合查询,显示和排除指定的查询结果

Query query = new Query();
query.fields().exclude("_id");
query.fields().include("name");
List<User> users = mongoTemplate.find(query, User.class, "user");

5、子集合中同时判断两个条件,portions.items 的子集合中 name 为 身高;同时 value 为 空 或者 NULL 的(未测试过,不一定正确)

Criteria.where("portions.items").elemMatch(
        Criteria.where("name").is("身高")
                .orOperator(Criteria.where("value").is(""), Criteria.where("value").is(null))
);

6、拼接条件

query.add多个creterria默认为and关系

Query query = new Query();
Criteria criteria = new Criteria();
if(StringUtils.isNotBlank(req.getPatientName())) {
    criteria.and("patientName")
            .regex(Pattern.compile("^.*"+req.getPatientName()+".*$", Pattern.CASE_INSENSITIVE));
}
if(StringUtils.isNotBlank(req.getUserId())) {
    criteria.and("orgCode").is(req.getUserId());
}
query.addCriteria(criteria);
Query query = new Query();
if(StringUtils.isNotBlank(req.getPatientName())) {
    query.addCriteria(Criteria.where("patientName")
            .regex(Pattern.compile("^.*"+req.getPatientName()+".*$", Pattern.CASE_INSENSITIVE)));
}
if(StringUtils.isNotBlank(req.getUserId())) {
    query.addCriteria(Criteria.where("orgCode").is(req.getUserId()));
}

7、分页查询

// skip = 跳过条数;limit - 获取条数
query.skip((req.getOffset()-1)*10).limit(req.getLimit());

猜你喜欢

转载自blog.csdn.net/zhangjian8641/article/details/107940935
今日推荐