springboot - mongodb 整合

springboot - mongodb 整合

基于 mongo:4.4.2

引入依赖

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

配置文件

spring.data.mongodb.host=localhost
spring.data.mongodb.database=mybatis
spring.data.mongodb.port=27017
spring.data.mongodb.username=admin
spring.data.mongodb.password=admin
spring.data.mongodb.authentication-database=admin

# 或者使用 uri
spring.data.mongodb.uri=mongodb://stwuser:111111@127.0.0.1:27017/stw?minPoolSize=0&maxPoolSize=200\
  &waitQueueMultiple=500&maxIdleTimeMS=15000&maxIdleTimeMS=20&waitQueueTimeoutMS=300000
#  &authSource=admin&authMechanism=SCRAM-SHA-1

数据模型

@Data
public class Person {
    private String id;
    private String name;
    private int age;
    private List<String> hobby;
    private String province;
    private Integer salary;
}

插入数据

@Test
public void insert() {
    Person person = new Person();
    person.setHobby(Arrays.asList("football"));
    person.setProvince("SH");
    person.setSalary(100);

    person.setId("3");
    person.setName("Tom");
    person.setAge(20);
    Person p = mongoTemplate.insert(person, "person");
    System.out.println(JSON.toJSONString(p));
}

查询全部

@Test
public void queryAll(){
    List<Person> list = mongoTemplate.find(new Query(), Person.class);
    System.out.println(JSON.toJSONString(list));
}

结果


[
 {"age":10,"hobby":["football","pingpong"],"id":"1","name":"Luffy","province":"JX","salary":200},
 {"age":100,"hobby":["football","pingpong","golf"],"id":"2","name":"Jack","province":"SH","salary":300},
 {"age":20,"hobby":["snok"],"id":"3","name":"Tom","province":"SH","salary":100}
]

条件查询

/**
* criteria query
* select * from person where name = 'Tom'
*/
@Test
public void queryCriteria(){
    Query query = new Query();
    query.addCriteria(Criteria.where("name").is("Tom"));
    Person person = mongoTemplate.findOne(query, Person.class);
    System.out.println(JSON.toJSONString(person));
}


结果

# result
{"age":20,"hobby":["snok"],"id":"3","name":"Tom","province":"SH","salary":100}

分页查询

默认第一页从0开始

//======================= page operations =================

/**
* select * from person order by salary desc limit 0,2
*/
@Test
public void pageTest(){
    // page start based zero
    int page=0;
    int pageSize =2;
    Query query = new Query();
    Sort salary = Sort.by(Sort.Direction.DESC, "salary");
    query.with(PageRequest.of(page, pageSize, salary));
    List<Person> list = mongoTemplate.find(query, Person.class);
    System.out.println(JSON.toJSONString(list));
}

// 或者
@Test
public void pagePerson(){
    int page = 3;
    int pageSize = 3;
    Query query = new Query();
    query.addCriteria(Criteria.where("name").regex("hello"));
    query.with(Sort.by(Sort.Order.desc("age")));
    query.limit(pageSize);
    query.skip((page-1)*pageSize);
    List<Person> list = mongoTemplate.find(query, Person.class);
    System.out.println(JSON.toJSONString(list));
}

结果

# result
[
 {"age":100,"hobby":["football","pingpong","golf"],"id":"2","name":"Jack","province":"SH","salary":300},
 {"age":10,"hobby":["football","pingpong"],"id":"1","name":"Luffy","province":"JX","salary":200}
]

范围查询

//======================= range operations =================
/**
* select * from person where hobby contains ("football" and "golf")
* contains both!!
*/
@Test
public void findAllCollection(){
    Query query = new Query();
    Criteria criteria = Criteria.where("hobby").all(Arrays.asList("football","golf"));
    query.addCriteria(criteria);
    List<Person> list = mongoTemplate.find(query, Person.class);
    System.out.println(JSON.toJSONString(list));
}

# result
[{"age":100,"hobby":["football","pingpong","golf"],"id":"2","name":"Jack","province":"SH","salary":300}]

/**
* select * from person where hobby in( "football", "golf") only need contains one
*/
@Test
public void findInCollection(){
    Query query = new Query();
    Criteria criteria = Criteria.where("hobby").in(Arrays.asList("football","golf"));
    query.addCriteria(criteria);
    List<Person> list = mongoTemplate.find(query, Person.class);
    System.out.println(JSON.toJSONString(list));
}

聚合查询

分组查询
//======================= aggregation operations =================
/**
* select province, sum(salary) as salary from person group by province
* [{"_id":"SH","salary":400},{"_id":"JX","salary":200}]
*/
@Test
public void groupByTest(){
    Aggregation aggregation = Aggregation.newAggregation(
    							Aggregation.group("province")
    							.sum("salary").as("salary"));
    List<Map> person = mongoTemplate.aggregate(aggregation, "person", Map.class).getMappedResults();
    System.out.println(JSON.toJSONString(person));
}

结果

# result
[{"_id":"SH","salary":400},{"_id":"JX","salary":200}]

更新

@Test
public void updateOne(){
    Query query = new Query();
    query.addCriteria(Criteria.where("id").is("3"));

    UpdateResult updateResult = mongoTemplate.updateFirst(query, 
    			Update.update("hobby", Arrays.asList("snok")), Person.class);
    System.out.println(JSON.toJSONString(updateResult));
}

删除

@Test
public void delete(){
    Query query = new Query();
    query.addCriteria(Criteria.where("name").is("Tom"));
    DeleteResult remove = mongoTemplate.remove(query, Person.class);
    System.out.println(JSON.toJSONString(remove));
}

@Test
public void deleteAll(){
    Query query = new Query();
    query.addCriteria(Criteria.where("name").regex("Tom"));
    List<Person> allAndRemove = mongoTemplate.findAllAndRemove(query, Person.class);
    System.out.println(JSON.toJSONString(allAndRemove));
}

问题

Exception authenticating MongoCredential{mechanism=SCRAM-SHA-256, userName=**

解决方案

spring.data.mongodb.host=localhost
spring.data.mongodb.database=mybatis
spring.data.mongodb.port=27017
spring.data.mongodb.username=admin
spring.data.mongodb.password=admin

## 需要加上这个, 要到admin库认证  !!
spring.data.mongodb.authentication-database=admin

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值