当前位置: 首页 > news >正文

spring boot学习第九篇:操作mongo的集合和集合中的数据

1、安装好了Mongodb

参考:ubuntu安装mongod、配置用户访问、添删改查-CSDN博客

2、pom.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.4</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.hmblogs</groupId><artifactId>hmblogs</artifactId><version>0.0.1-SNAPSHOT</version><name>hmblogs</name><description>hmblogs</description><properties><java.version>8</java.version><druid.version>1.2.8</druid.version><log4jdbc.version>1.16</log4jdbc.version><es.version>7.9.2</es.version></properties><dependencies><!-- druid数据源驱动 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- mybatis --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--Mysql依赖包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!--lombok插件--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--监控sql日志--><dependency><groupId>org.bgee.log4jdbc-log4j2</groupId><artifactId>log4jdbc-log4j2-jdbc4.1</artifactId><version>${log4jdbc.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.9</version></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId></dependency><dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId></dependency><!-- high client--><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>${es.version}</version><exclusions><exclusion><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId></exclusion><exclusion><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId></exclusion></exclusions></dependency><!-- rest-high-level-client 依赖如下2个jar --><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>${es.version}</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>${es.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

3、application.yml文件内容如下:

server:port: 8081servlet.context-path: /#配置数据源
spring:datasource:druid:db-type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpyurl: jdbc:log4jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:eladmin}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=falseusername: ${DB_USER:root}password: ${DB_PWD:密码}redis:host: localhostport: 6379password: hemingdatabase: 10data:mongodb:uri: mongodb://hmblogs:密码@43.138.0.199:27017/hmblogses:host: 43.138.0.199port: 9200scheme: http

4、UserEntity文件内容如下:

package com.hmblogs.backend.entity;import lombok.Data;import java.io.Serializable;@Data
public class UserEntity implements Serializable {private static final long serialVersionUID = -3258839839160856613L;private Long id;private String userName;private String passWord;//getter、setter省略
}

5、UserDaoImpl文件内容如下:

package com.hmblogs.backend.dao;import com.hmblogs.backend.entity.UserEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;@Component
public class UserDaoImpl implements UserDao {@Autowiredprivate MongoTemplate mongoTemplate;/*** 创建对象* @param user*/@Overridepublic void saveUser(UserEntity user) {mongoTemplate.save(user);}/*** 根据用户名查询对象* @param userName* @return*/@Overridepublic UserEntity findUserByUserName(String userName) {Query query=new Query(Criteria.where("userName").is(userName));UserEntity user =  mongoTemplate.findOne(query , UserEntity.class);return user;}/*** 更新对象* @param user*/@Overridepublic void updateUser(UserEntity user) {Query query=new Query(Criteria.where("id").is(user.getId()));Update update= new Update().set("userName", user.getUserName()).set("passWord", user.getPassWord());//更新查询返回结果集的第一条mongoTemplate.updateFirst(query,update,UserEntity.class);//更新查询返回结果集的所有// mongoTemplate.updateMulti(query,update,UserEntity.class);}/*** 删除对象* @param id*/@Overridepublic void deleteUserById(Long id) {Query query=new Query(Criteria.where("id").is(id));mongoTemplate.remove(query,UserEntity.class);}
}

6、UserDao文件内容如下:

package com.hmblogs.backend.dao;import com.hmblogs.backend.entity.UserEntity;public interface UserDao {public void saveUser(UserEntity user);public UserEntity findUserByUserName(String userName);public void updateUser(UserEntity user);public void deleteUserById(Long id);}

7、测试验证类,内容如下:

package com.hmblogs.backend.util;import com.hmblogs.backend.dao.UserDao;
import com.hmblogs.backend.entity.UserEntity;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)
@SpringBootTest
public class UserDaoTest {@Autowiredprivate UserDao userDao;@Testpublic void testSaveUser() throws Exception {UserEntity user=new UserEntity();user.setId(2l);user.setUserName("小明");user.setPassWord("fffooo123");userDao.saveUser(user);}@Testpublic void findUserByUserName(){UserEntity user= userDao.findUserByUserName("小明");System.out.println("user is "+user);}@Testpublic void updateUser(){UserEntity user=new UserEntity();user.setId(2l);user.setUserName("天空");user.setPassWord("fffxxxx");userDao.updateUser(user);}@Testpublic void deleteUserById(){userDao.deleteUserById(1l);}}

7.1新增

执行报错testSaveUser()方法,执行报错:

org.springframework.data.mongodb.UncategorizedMongoDbException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='hmblogs', source='hmblogs', password=<hidden>, mechanismProperties=<hidden>}; nested exception is com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='hmblogs', source='hmblogs', password=<hidden>, mechanismProperties=<hidden>}at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:140)at org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:2906)at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:557)at org.springframework.data.mongodb.core.MongoTemplate.saveDocument(MongoTemplate.java:1508)at org.springframework.data.mongodb.core.MongoTemplate.doSave(MongoTemplate.java:1444)at org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:1387)at org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:1372)at com.hmblogs.backend.dao.UserDaoImpl.saveUser(UserDaoImpl.java:23)at com.hmblogs.backend.util.UserDaoTest.testSaveUser(UserDaoTest.java:24)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)at org.junit.runners.ParentRunner.run(ParentRunner.java:413)at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)at org.junit.runner.JUnitCore.run(JUnitCore.java:137)at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
Caused by: com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='hmblogs', source='hmblogs', password=<hidden>, mechanismProperties=<hidden>}at com.mongodb.internal.connection.SaslAuthenticator.wrapException(SaslAuthenticator.java:273)at com.mongodb.internal.connection.SaslAuthenticator.getNextSaslResponse(SaslAuthenticator.java:137)at com.mongodb.internal.connection.SaslAuthenticator.access$100(SaslAuthenticator.java:48)at com.mongodb.internal.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:63)at com.mongodb.internal.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:57)at com.mongodb.internal.connection.SaslAuthenticator.doAsSubject(SaslAuthenticator.java:280)at com.mongodb.internal.connection.SaslAuthenticator.authenticate(SaslAuthenticator.java:57)at com.mongodb.internal.connection.DefaultAuthenticator.authenticate(DefaultAuthenticator.java:55)at com.mongodb.internal.connection.InternalStreamConnectionInitializer.authenticate(InternalStreamConnectionInitializer.java:207)at com.mongodb.internal.connection.InternalStreamConnectionInitializer.finishHandshake(InternalStreamConnectionInitializer.java:81)at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:185)at com.mongodb.internal.connection.UsageTrackingInternalConnection.open(UsageTrackingInternalConnection.java:54)at com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection.open(DefaultConnectionPool.java:538)at com.mongodb.internal.connection.DefaultConnectionPool$OpenConcurrencyLimiter.openWithConcurrencyLimit(DefaultConnectionPool.java:914)at com.mongodb.internal.connection.DefaultConnectionPool$OpenConcurrencyLimiter.openOrGetAvailable(DefaultConnectionPool.java:855)at com.mongodb.internal.connection.DefaultConnectionPool.get(DefaultConnectionPool.java:173)at com.mongodb.internal.connection.DefaultConnectionPool.get(DefaultConnectionPool.java:162)at com.mongodb.internal.connection.DefaultServer.getConnection(DefaultServer.java:101)at com.mongodb.internal.binding.ClusterBinding$ClusterBindingConnectionSource.getConnection(ClusterBinding.java:175)at com.mongodb.client.internal.ClientSessionBinding$SessionBindingConnectionSource.getConnection(ClientSessionBinding.java:188)at com.mongodb.internal.operation.OperationHelper.withSuppliedResource(OperationHelper.java:581)at com.mongodb.internal.operation.OperationHelper.lambda$withSourceAndConnection$3(OperationHelper.java:563)at com.mongodb.internal.operation.OperationHelper.withSuppliedResource(OperationHelper.java:589)at com.mongodb.internal.operation.OperationHelper.withSourceAndConnection(OperationHelper.java:562)at com.mongodb.internal.operation.MixedBulkWriteOperation.lambda$execute$3(MixedBulkWriteOperation.java:232)at com.mongodb.internal.async.function.RetryingSyncSupplier.get(RetryingSyncSupplier.java:65)at com.mongodb.internal.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:268)at com.mongodb.internal.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:84)at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:212)at com.mongodb.client.internal.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:1010)at com.mongodb.client.internal.MongoCollectionImpl.executeReplaceOne(MongoCollectionImpl.java:568)at com.mongodb.client.internal.MongoCollectionImpl.replaceOne(MongoCollectionImpl.java:551)at org.springframework.data.mongodb.core.MongoTemplate.lambda$saveDocument$18(MongoTemplate.java:1540)at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:555)... 39 more
Caused by: com.mongodb.MongoCommandException: Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server 43.138.0.199:27017. The full response is {"ok": 0.0, "errmsg": "Authentication failed.", "code": 18, "codeName": "AuthenticationFailed"}at com.mongodb.internal.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:198)at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:418)at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:342)at com.mongodb.internal.connection.CommandHelper.sendAndReceive(CommandHelper.java:96)at com.mongodb.internal.connection.CommandHelper.executeCommand(CommandHelper.java:44)at com.mongodb.internal.connection.SaslAuthenticator.sendSaslStart(SaslAuthenticator.java:228)at com.mongodb.internal.connection.SaslAuthenticator.getNextSaslResponse(SaslAuthenticator.java:135)... 71 more

继续找下办法看怎么处理。

参考:org.springframework.data.mongodb.UncategorizedMongoDbException: Exception authenticating MongoCreden-CSDN博客

问题解决了,能正常保存了。

application.yml文件内容如下:

server:port: 8081servlet.context-path: /#配置数据源
spring:datasource:druid:db-type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpyurl: jdbc:log4jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:eladmin}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=falseusername: ${DB_USER:root}password: ${DB_PWD:密码保密}redis:host: localhostport: 6379password: hemingdatabase: 10data:mongodb:host: 43.138.0.199port: 27017username: hmblogspassword: 密码保密database: hmblogsauthentication-database: admines:host: 43.138.0.199port: 9200scheme: http

console截图如下:

在Robo 3T里面查看数据,有对应数据,集合不存在也自动创建了。

7.2查询

执行findUserByUserName(),根据查询条件查看单个数据:

7.3修改数据,

执行updateUser()方法,

在Robo 3T中查看数据,如下所示:

7.4删除数据,

 

查看数据,还是保留了id为2的数据。要删id为2的数据,则参数改成2

然后查看数据,该集合已经变成空的了。

7.5排序分页,用添加数据的方法执行5条数据后,分页查询数据以及根据查询条件分页查询数据,对数据排序,如下:

大于&&排序:

public List<UserEntity> findUserByCriteria(UserEntity user) {Query query=new Query(Criteria.where("id").gt(user.getId()));List<UserEntity> users =  mongoTemplate.find(query , UserEntity.class);users.sort(new Comparator<UserEntity>() {@Overridepublic int compare(UserEntity o1, UserEntity o2) {return o1.getId().intValue()-o2.getId().intValue();}});return users;}

结果如下:

只查出了id>2的数据,且按id升序排序。

下面再看看,根据查询条件分页查询数据,id大于2,且查出第2页数据,每页2条记录,那就查出id=5和id=7的记录,同时要查出总数,便于页面分页。对分页之后得到的结果排序意义不大。

执行结果如下:

现贴出有新增和修改的代码,

新增了PageQuery代码如下:

package com.hmblogs.backend.dao;import lombok.Data;@Data
public class PageQuery<T> {private int pageNum;private int pageSize;private T criteria;
}

新增了PageResult代码如下:

package com.hmblogs.backend.dao;import lombok.Data;import java.util.List;@Data
public class PageResult<T> {private long totalRecord;private List<T> list;
}

UserDao类追加代码如下:

package com.hmblogs.backend.dao;import com.hmblogs.backend.entity.UserEntity;public interface UserDao {public void saveUser(UserEntity user);public UserEntity findUserByUserName(String userName);public void updateUser(UserEntity user);public void deleteUserById(Long id);public PageResult<UserEntity> findUserByCriteria(PageQuery<UserEntity> pageQuery);}

UserDaoImpl类追加代码如下,import块有改动,所以贴出该类的代码:

package com.hmblogs.backend.dao;import com.hmblogs.backend.entity.UserEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;import java.util.Comparator;
import java.util.List;@Component
public class UserDaoImpl implements UserDao {@Autowiredprivate MongoTemplate mongoTemplate;/*** 创建对象* @param user*/@Overridepublic void saveUser(UserEntity user) {mongoTemplate.save(user);}/*** 根据用户名查询对象* @param userName* @return*/@Overridepublic UserEntity findUserByUserName(String userName) {Query query=new Query(Criteria.where("userName").is(userName));UserEntity user =  mongoTemplate.findOne(query , UserEntity.class);return user;}/*** 更新对象* @param user*/@Overridepublic void updateUser(UserEntity user) {Query query=new Query(Criteria.where("id").is(user.getId()));Update update= new Update().set("userName", user.getUserName()).set("passWord", user.getPassWord());//更新查询返回结果集的第一条mongoTemplate.updateFirst(query,update,UserEntity.class);//更新查询返回结果集的所有// mongoTemplate.updateMulti(query,update,UserEntity.class);}/*** 删除对象* @param id*/@Overridepublic void deleteUserById(Long id) {Query query=new Query(Criteria.where("id").is(id));mongoTemplate.remove(query,UserEntity.class);}@Overridepublic PageResult<UserEntity> findUserByCriteria(PageQuery<UserEntity> pageQuery) {int pageNum = pageQuery.getPageNum();int pageSize = pageQuery.getPageSize();UserEntity userEntityQuery = pageQuery.getCriteria();Query query = new Query(Criteria.where("id").gt(userEntityQuery.getId()));long count = mongoTemplate.count(query, UserEntity.class);Query queryList = query.skip((pageNum-1)*pageSize).limit(pageSize);List<UserEntity> users =  mongoTemplate.find(queryList , UserEntity.class);PageResult<UserEntity> pageResult = new PageResult<UserEntity>();pageResult.setList(users);pageResult.setTotalRecord(count);return pageResult;}
}

UserDaoTest代码如下:

package com.hmblogs.backend.util;import com.hmblogs.backend.dao.PageQuery;
import com.hmblogs.backend.dao.PageResult;
import com.hmblogs.backend.dao.UserDao;
import com.hmblogs.backend.entity.UserEntity;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.util.List;@RunWith(SpringRunner.class)
@SpringBootTest
public class UserDaoTest {@Autowiredprivate UserDao userDao;@Testpublic void testSaveUser() throws Exception {UserEntity user=new UserEntity();user.setId(4l);user.setUserName("aa");user.setPassWord("bb");userDao.saveUser(user);}@Testpublic void findUserByUserName(){UserEntity user= userDao.findUserByUserName("小明");System.out.println("user is "+user);}@Testpublic void updateUser(){UserEntity user=new UserEntity();user.setId(2l);user.setUserName("天空");user.setPassWord("fffxxxx");userDao.updateUser(user);}@Testpublic void deleteUserById(){userDao.deleteUserById(2l);}@Testpublic void findUsersByCriteria(){UserEntity userQuery = new UserEntity();userQuery.setId(2l);PageQuery<UserEntity> pageQuery = new PageQuery<UserEntity>();pageQuery.setCriteria(userQuery);pageQuery.setPageNum(2);pageQuery.setPageSize(2);PageResult<UserEntity> user= userDao.findUserByCriteria(pageQuery);System.out.println("user is "+user);}
}

根据查询条件筛选数据、分页、查出符合查询条件的总数,都做到了,如果还要再加上要根据最后修改时间降序排序,最后修改的数据要放在第1页,很早之前修改的数据放在最后一页,这里可以理解为根据id降序排序,id值越大的说明越晚产生的,那就是查出id为3、4的记录了,而不是id为5、7的记录。

数据以及需求如下图所示:

但是mongoTemplate的API,没看到有sort的API,怎么办呢?搜资料发现,如下代码可以实现:

public PageResult<UserEntity> findUserByCriteria(PageQuery<UserEntity> pageQuery) {int pageNum = pageQuery.getPageNum();int pageSize = pageQuery.getPageSize();UserEntity userEntityQuery = pageQuery.getCriteria();Query query = new Query(Criteria.where("id").gt(userEntityQuery.getId()));long count = mongoTemplate.count(query, UserEntity.class);// 10. 分页// 11. 排序query.with(PageRequest.of(pageNum-1, pageSize,Sort.by(Sort.Order.desc("id"))));List<UserEntity> users =  mongoTemplate.find(query , UserEntity.class);PageResult<UserEntity> pageResult = new PageResult<UserEntity>();pageResult.setList(users);pageResult.setTotalRecord(count);return pageResult;}

执行结果如下:

7.6模糊查询

public void querys() {String name = "a";String regex = String.format("%s%s%s", "^.*", name, ".*$");//采用正则表达式进行匹配Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);Query query = new Query(Criteria.where("userName").regex(pattern));List<UserEntity> users =  mongoTemplate.find(query , UserEntity.class);System.out.println("user is "+users);}

 7.7多条件一起查询

public void querys() {String name = "a";String regex = String.format("%s%s%s", "^.*", name, ".*$");//采用正则表达式进行匹配Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);Criteria criteria = Criteria.where("userName").regex(pattern);Query query = new Query(); //条件构建部分query.addCriteria(criteria);query.addCriteria(Criteria.where("passWord").is("bb"));List<UserEntity> users =  mongoTemplate.find(query , UserEntity.class);System.out.println("user is "+users);}

userName包含a的,且passWord是bb的。

7.8 聚合

Student类代码如下:

package com.hmblogs.backend.entity;import lombok.Data;/*** mongo集合对应的类*/
@Data
public class Student {private Long id;private String name;private int age;private String sex;//getter、setter省略
}

StudentGroupResult代码如下:

package com.hmblogs.backend.entity;import lombok.Data;/*** 通过聚合查询的结果对应的类*/
@Data
public class StudentGroupResult {private String id;private int ageTotal;private String nameMax;
}

UserDao追加代码:

public void aggregate();

UserDaoImpl代码如下,所有的import(包含之前方法用到的import),和测试聚合的方法代码,如下:

package com.hmblogs.backend.dao;import com.hmblogs.backend.entity.Student;
import com.hmblogs.backend.entity.StudentGroupResult;
import com.hmblogs.backend.entity.UserEntity;
import org.assertj.core.util.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.*;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregationOptions;
@Component
public class UserDaoImpl implements UserDao {@Autowiredprivate MongoTemplate mongoTemplate;@Overridepublic void aggregate() {List<AggregationOperation> operations = Lists.newArrayList();Criteria criteria = new Criteria();// todo 增加过滤条件operations.add(Aggregation.match(criteria));GroupOperation groupOperation = new GroupOperation(Fields.fields("sex")).sum("age").as("ageTotal").max("name").as("nameMax");operations.add(groupOperation);Aggregation aggregation = Aggregation.newAggregation(operations).withOptions(newAggregationOptions().allowDiskUse(true).build());AggregationResults<StudentGroupResult> aggregationResults =mongoTemplate.aggregate(aggregation, "Student", StudentGroupResult.class);System.out.println(aggregationResults.getMappedResults());}
}

UserDaoTest追加代码如下:

@Testpublic void aggregate(){userDao.aggregate();}

运行效果如下:

7.9upsert

UserDaoImpl追加如下代码:

@Overridepublic void upsert() {Query query=new Query(Criteria.where("id").is(6));Update update= new Update().set("userName", "wangwu66").set("passWord", "pp66");//更新查询返回结果集的第一条mongoTemplate.upsert(query,update,"Student");}

这里的is(4)、is(6)分别表示修改、新增数据。 

UserDao追加如下代码:

public void upsert();

UserDaoTest追加如下代码:

@Testpublic void upsert(){userDao.upsert();}

结果如下截图:

7.10根据二级属性值查询

7.10.1二级属性在JSONObject对象中的

db.userEntity.find({"comments.advantage":"人品不差"})

7.10.2二级属性在JSONArray数组中的情况

只是根据数组中的一个属性查询,可以像下面这样:

db.userEntity.find({"xueli":{"shuoshi":"qinghuadaxue"}})

 但是如果2个属性一起查,这样就不行了。

那怎么写呢,2个属性一起查

db.userEntity.find({"xueli":{"$elemMatch":{"shuoshi":"qinghuadaxue","benke": "zhongnanlinyekejidaxue"}}})

网上说是这样,但是没达到效果

8、基于MongoRepository开发CRUD

User类代码如下所示:

package com.hmblogs.backend.entity;import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;/*** @author :heming* @description:TODO* @date :2024-02-04 14:26*/
@Data
@Document("User")
public class User {@Idprivate String id;private String name;private Integer age;private String email;private String createDate;}

UserRepository代码如下所示:

package com.hmblogs.backend.dao;import com.hmblogs.backend.entity.User;
import org.springframework.data.mongodb.repository.MongoRepository;//实现Mongodb的增删改查方法
public interface UserRepository extends MongoRepository<User,String> {
}

测试类代码如下所示:

package com.hmblogs.backend.util;import com.hmblogs.backend.dao.UserRepository;
import com.hmblogs.backend.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.*;import java.util.List;/*** @author :程序员徐大大* @description:TODO* @date :2022-04-08 20:16*/
@SpringBootTest
public class MongodbTest {//注入mongoTemplate@Autowiredprivate UserRepository userRepository;//添加@Testpublic void createUser() {User user = new User();user.setAge(20);user.setName("张三");user.setEmail("3332200@qq.com");User user1 = userRepository.save(user);}//查询所有@Testpublic void findUser() {List<User> userList = userRepository.findAll();System.out.println(userList);}//id查询@Testpublic void getById() {User user = userRepository.findById("65bf3089425b826e2b08cc4b").get();System.out.println(user);}//条件查询@Testpublic void findUserList() {User user = new User();user.setName("张三");user.setAge(20);Example<User> userExample = Example.of(user); //构建条件List<User> userList = userRepository.findAll(userExample);System.out.println(userList);}//模糊查询@Testpublic void findUsersLikeName() {//创建匹配器,即如何使用查询条件ExampleMatcher matcher = ExampleMatcher.matching() //构建对象.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询.withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写User user = new User();user.setName("三");Example<User> userExample = Example.of(user, matcher);List<User> userList = userRepository.findAll(userExample);System.out.println(userList);}//分页查询@Testpublic void findUsersPage() {Sort sort = Sort.by(Sort.Direction.DESC, "age");
//0为第一页Pageable pageable = PageRequest.of(0, 10, sort);
//创建匹配器,即如何使用查询条件ExampleMatcher matcher = ExampleMatcher.matching() //构建对象.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询.withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写User user = new User();user.setName("三");Example<User> userExample = Example.of(user, matcher);
//创建实例Example<User> example = Example.of(user, matcher);Page<User> pages = userRepository.findAll(example, pageable);System.out.println(pages);}//修改@Testpublic void updateUser() {User user = userRepository.findById("65bf3089425b826e2b08cc4b").get();user.setName("张三_1");user.setAge(25);user.setEmail("883220990@qq.com");user.setCreateDate("2024-02-04 14:42:00");User save = userRepository.save(user);System.out.println(save);}//删除@Testpublic void delete() {userRepository.deleteById("65bf3089425b826e2b08cc4b");}}

经过实际验证,都符合期望。

相关文章:

  • 爬虫实战--人民网
  • 记一次CPU有规律飙高的线上问题排查过程
  • JAVA面试汇总总结更新中ing
  • 【AI数字人-论文】Geneface论文
  • 【芯片设计- RTL 数字逻辑设计入门 6 -- 带同步复位的D触发器 RTL实现及testbench 验证】
  • JAVA中的main方法
  • 【方法论】费曼学习方法
  • 【Spring Boot 3】【JPA】嵌入式对象
  • 文心一言4.0API接入指南
  • 2024Node.js零基础教程(小白友好型),nodejs新手到高手,(五)NodeJS入门——http模块
  • C# OpenCvSharp DNN 部署yolov4目标检测
  • Linux 性能调优之存储设备调优
  • GADM 4.1 全球国家行政区划下载
  • 代码随想录算法训练营第39天(动态规划02● 62.不同路径 ● 63. 不同路径 II
  • 揭秘:IT行业有哪些证书含金量高?
  • AHK 中 = 和 == 等比较运算符的用法
  • CAP理论的例子讲解
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • mac修复ab及siege安装
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Redis的resp协议
  • SpiderData 2019年2月16日 DApp数据排行榜
  • SwizzleMethod 黑魔法
  • VuePress 静态网站生成
  • Xmanager 远程桌面 CentOS 7
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 汉诺塔算法
  • 七牛云假注销小指南
  • 前端知识点整理(待续)
  • 使用Swoole加速Laravel(正式环境中)
  • 微信开源mars源码分析1—上层samples分析
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 阿里云移动端播放器高级功能介绍
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • $(selector).each()和$.each()的区别
  • (¥1011)-(一千零一拾一元整)输出
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (TOJ2804)Even? Odd?
  • (八)c52学习之旅-中断实验
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (分布式缓存)Redis分片集群
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (未解决)macOS matplotlib 中文是方框
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)jdk与jre的区别
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .mysql secret在哪_MySQL如何使用索引
  • .NET Micro Framework初体验
  • .NetCore项目nginx发布