spring boot 集成mongoDB操作

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

application.yml配置mongo

spring:
  data:
    mongodb:
      uri: mongodb://appdb:appdb@node01:28017/appdb
#      username: appdb
#      password: 3EF7C9080589F0AB
#      authentication-database: appdb
#      host: node01
#      port: 28017
#      database: appdb

 

好了开始job演习,下面直接开始实际项目为标准来记录mongoDb的使用

1:一般情况下会创建一个PO实体类来维护mongo集合字段,当然如果说你的表字段变化比较频繁可以知己使用JsonObject来接收,当然使用Document BDObjec都是可以的。

我们创建实体类User

 

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Document("user")
public class User implements Serializable {

    @Id
    private String id;
    private String userName;
    private String userId;
    private Integer age;
    private String sex;
    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
    private Date birthDay;
}

mongoTemplate操作

save:

   public void save(Object entity) {
        getMongoTemplate().save(entity);
    }

    public void save(Object entity, String collectionName) {
        getMongoTemplate().save(entity, collectionName);
    }

    public void save(Iterable<?> entities, String collectionName) {
        getMongoTemplate().insert(entities, collectionName);
    }

 

find查询

  /**
     * 查询一条记录
     *
     * @param query
     * @param poClass
     * @param <T>
     * @return
     */
    public <T> T findOne(Query query, Class<T> poClass) {
        return getMongoTemplate().findOne(query, poClass);
    }

    public <T> T findOne(Query query, String collectionName, Class<T> poClass) {
        return getMongoTemplate().findOne(query, poClass, collectionName);
    }

    /**
     * 查询符合条件的所有记录
     *
     * @param query
     * @param poClass
     * @param <T>
     * @return List
     */

    public <T> List<T> findList(Query query, Class<T> poClass) {
        return getMongoTemplate().find(query, poClass);
    }

    public <T> List<T> findList(Query query, String collectionName, Class<T> poClass) {
        return getMongoTemplate().find(query, poClass, collectionName);
    }

分页查询

 

 /**
     * 分页查询
     *
     * @param query
     * @param collectionName
     * @param poClass
     * @param pageInfo
     * @param <T>
     * @return
     */
    public <T> List<T> findByPage(Query query, String collectionName, Class<T> poClass, PageInfo pageInfo) {
        if (pageInfo == null) {
            return getMongoTemplate().find(query, poClass, collectionName);
        }
        pageInfo.setTotalRecords(getMongoTemplate().count(query, collectionName));
        query.skip(pageInfo.getStartIndex()).limit(pageInfo.getResults());
        return getMongoTemplate().find(query, poClass, collectionName);
    }

    public <T> List<T> findByPage(Query query, Class<T> poClass, PageInfo pageInfo) {
        if (pageInfo == null) {
            return getMongoTemplate().find(query, poClass);
        }
        pageInfo.setTotalRecords(count(query, poClass));
        return getMongoTemplate().find(query.skip(pageInfo.getStartIndex()).limit(pageInfo.getResults()), poClass);

    }

    public <T> List<T> findByPageWithSort(Query query, Class<T> poClass, String collectionName, PageInfo pageInfo, Sort sort) {
        query.with(sort);
        if (pageInfo == null) {
            return getMongoTemplate().find(query, poClass, collectionName);
        }
        pageInfo.setTotalRecords(count(query, collectionName));
        return getMongoTemplate().find(query.skip(pageInfo.getStartIndex()).limit(pageInfo.getResults()), poClass);

    }


    /**
     * 查询指定字段
     *
     * @param queryObject
     * @param queryField
     * @param collections
     * @return List
     */
    public List<JSONObject> findToJSONObject(JSONObject queryObject, JSONObject queryField, String collections, Sort sort) {
        Query query = new Query();
        if (queryObject != null) {
            if (queryField != null) {
                query = new BasicQuery(JSON.toJSONString(queryObject), JSON.toJSONString(queryField));
            } else {
                query = new BasicQuery(JSON.toJSONString(queryObject));
            }
        }
        if (sort != null) {
            query.with(sort);
        }
        return getMongoTemplate().find(query, JSONObject.class, collections);
    }

聚合操作:


    /**
     * 分组查询
     *
     * @param aggregation
     * @param collections
     * @param clazz
     * @param <T>
     * @return List
     */
    public <T> List<T> findByGroup(Aggregation aggregation, String collections, Class<T> clazz) {
        AggregationResults<T> result = getMongoTemplate().aggregate(aggregation, collections, clazz);
        return result.getMappedResults();
    }

count统计

 

/**
     * 统计查询
     *
     * @param query
     * @param poClass
     * @param <T>
     * @return
     */
    public <T> long count(Query query, Class<T> poClass) {
        return getMongoTemplate().count(query, poClass);
    }

    public long count(Query query, String collectionName) {
        return getMongoTemplate().count(query, collectionName);
    }

更新操作

 

 /**
     * 删除
     *
     * @param query
     * @param poClass
     * @param <T>
     * @return
     */
    public <T> int delete(Query query, Class<T> poClass) {
        DeleteResult result = getMongoTemplate().remove(query, poClass);
        return (int) result.getDeletedCount();
    }

    public int delete(Query query, String collections) {
        DeleteResult result = getMongoTemplate().remove(query, collections);
        return (int) result.getDeletedCount();
    }

    /**
     * 批量更新操作
     *
     * @param query
     * @param update
     * @param poClass
     * @param <T>
     * @return
     */
    public <T> int update(Query query, Update update, Class<T> poClass) {
        return (int) getMongoTemplate().updateMulti(query, update, poClass).getModifiedCount();
    }

    public int update(Query query, Update update, String collections) {
        return (int) getMongoTemplate().updateMulti(query, update, collections).getModifiedCount();
    }

    /**
     * 只更新符合条件的第一个
     *
     * @param query
     * @param update
     * @param collectionName
     * @return
     */
    public int updateFirst(Query query, Update update, String collectionName) {
        return (int) getMongoTemplate().updateFirst(query, update, collectionName).getModifiedCount();
    }

 


    public boolean collectionExists(String collection) {
        return getMongoTemplate().collectionExists(collection);
    }

    public String getCollectionName(Class<Employee> employeeClass) {
        return getMongoTemplate().getCollectionName(employeeClass);
    }

上面介绍了MongoTemplate API主要方法,在实际操作中,对于数据的CRUD操作都是基于上面的API,下面介绍一些聚合操作的一些方法,对于上面给出的实体类User的基本操作也可以使用以上APi方法

Aggregation聚合操作

分组条件统计

 

ProjectionOperation projectionOperation = Aggregation.project("userName","age", "sex", "userId");
MatchOperation matchOperation = Aggregation.match(Criteria.where("userId").ne(""));
GroupOperation groupOperation = Aggregation.group("userId","userName").count().as("totalUser")
        .sum(ConditionalOperators.Cond.when(Criteria.where("age").gte(20)).then(1).otherwise(0)).as("ages");
Aggregation aggregation = Aggregation.newAggregation( projectionOperation,groupOperation, matchOperation);

return mongoTemplate.aggregate(aggregation, User.class, JSONObject.class).getMappedResults();

测试输出:

{"success":true,"code":"200","msg":"操作成功","data":[{"totalUser":1,"ages":1,"_id":{"userId":"24","userName":"小王"}},{"totalUser":1,"ages":1,"_id":{"userId":"23","userName":"小王11"}},{"totalUser":4,"ages":4,"_id":{"userId":"25","userName":"小王"}},{"totalUser":3,"ages":2,"_id":{"userId":"25","userName":"小王22"}}]}

多个嵌套分组聚合操作

 @Override
    public List<JSONObject> group3() {
        ConditionalOperators.Cond cond =ConditionalOperators.Cond
                .when(Criteria.where("age").gte(20))
                .then(1).otherwise(0);
        MatchOperation matchOperation = Aggregation.match(Criteria.where("userId").ne(""));
        GroupOperation groupOperation = Aggregation.group("userId","userName").count().as("totalUser")
                .sum(cond).as("ages")
                .addToSet("sex").as("sex")
                .addToSet("birthDay").as("birthDay");

        //嵌套分组 将前面分组的ID再次分组
//        GroupOperation groupOperation1 = Aggregation.group("_id.userId").addToSet("userName").as("userName");
        //将前面分组的输出结果再次分组
        GroupOperation groupOperation1 = Aggregation.group("ages")
                .addToSet("userName").as("userName")
                .addToSet("userName").as("userName")
                .addToSet("userId").as("userId")
                //如果前面没有sex 直接使用是会包报错找不到sex字段
                .addToSet("sex").as("sex")
                .addToSet("birthDay").as("birthDay");
        Aggregation aggregation = Aggregation.newAggregation(groupOperation,groupOperation1, matchOperation);

        return mongoTemplate.aggregate(aggregation, User.class, JSONObject.class).getMappedResults();
    }

输出结果:

{
	"success": true,
	"code": "200",
	"msg": "操作成功",
	"data": [
		{
			"birthDay": [
				[
					"2020-11-20T12:02:20.000+00:00"
				]
			],
			"sex": [
				[
					"女"
				]
			],
			"_id": 4,
			"userName": [
				"小王"
			],
			"userId": [
				"25"
			]
		},
		{
			"birthDay": [
				[
					"2020-11-20T12:02:20.000+00:00"
				]
			],
			"sex": [
				[
					"女",
					"男"
				]
			],
			"_id": 2,
			"userName": [
				"小王22"
			],
			"userId": [
				"25"
			]
		},
		{
			"birthDay": [
				[
					"2020-11-20T12:02:20.000+00:00"
				]
			],
			"sex": [
				[
					"女"
				]
			],
			"_id": 1,
			"userName": [
				"小王11",
				"小王"
			],
			"userId": [
				"24",
				"23"
			]
		}
	]
}

distinct去重

    public List<String> distinct() {
        Query query = new Query();
        query.addCriteria(Criteria.where("age").ne(null));
        List<String> userNames = mongoTemplate.findDistinct(query, "userName", User.class, String.class);
        return userNames;
    }

测试输出: 

{

    "success": true,

    "code": "200",

    "msg": "操作成功",

    "data": [

        "小王",

        "小王11",

        "小王22"

    ]

}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员路同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值