今天是实现连接mongo数据库,查询数据,以前没接触过非关系型数据库。。所以弄得很慢。。。
连接使用mongo数据库需要导入的依赖
在yml中配置数据库:
//这样配置数据库运行报错了
spring:
data:
mongodb:
uri: mongodb://'数据库名':'数据库密码'@'数据库地址':'端口号'/'数据库名'
//错误如下:
Exception authenticating MongoCredential{mechanism=SCRAM-SHA-256, userName='pds', source='pds', password=<hidden>, mechanismProperties=<hidden>}; nested exception is com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-256, userName='pds', source='pds', password=<hidden>, mechanismProperties=<hidden>}
//应在后面加上一段,正确的为:
spring:
data:
mongodb:
uri: mongodb://'数据库名':'数据库密码'@'数据库地址':'端口号'/'数据库名'?authSource=admin&authMechanism=SCRAM-SHA-1
GPT解释:authSource=admin 中的 authSource 表示在进行身份验证时,使用哪个数据库来验证用户名和密码。在 MongoDB 中,一个服务器可以包含多个数据库。如果没有指定 authSource,MongoDB 将使用连接字符串中指定的默认数据库(通常是连接字符串中最后一个斜杠后面的那个字符串)来验证身份。
在这个例子中,指定了 authSource=admin,表示在进行身份验证时使用 admin 数据库来验证用户名和密码。这意味着,要求在连接 MongoDB 时提供 admin 数据库的用户名和密码。
需要注意的是,对于不同的 MongoDB 版本,authSource 的含义可能会有所不同。在 MongoDB 3.0 及以上版本中,authSource 指定的是进行身份验证的数据库。但在较早的版本中,authSource 与 authdb 参数是等效的,用于指定要连接的数据库。因此,在编写代码时需根据具体的 MongoDB 版本来确定使用哪种方式进行设置。
另外,除了 authSource,还可以使用 authMechanism 参数来指定要使用的身份验证机制,例如 SCRAM-SHA-1、MONGODB-CR 等。
创建对应的实体类:
//collection是指定mongo数据库中的哪个collection
/**
* mongo数据库中的data集合实体类
*/
@Document(collection = "data")
@lombok.Data
@AllArgsConstructor
@NoArgsConstructor
public class Data {
private String _id;
@Field(value = "uuid")
private String uuid;
@Field(value = "data")
private String data;
@Field(value = "sign")
private String sign;
@Field(value = "request_id")
private String request_id;
@Field(value = "_class")
private String _class;
}
mongo数据库的查询与SQL型的数据库有些不同。
mongo不需要创建Mapper,直接创建service和service的实现类就可以,查询语句可以在service的实现类中写,service就相当于dao层了。如下:
/**
* data集合接口方法
*/
public interface IDataService{
/**
* 跟据uuid查询返回一个数组
* @param id
* @return
*/
List<Data> findByUuid(String id);
/**
* 根据uuid查询返回一个对象
* @param uuid
* @return
*/
Data findByUuidOne(String uuid);
}
/**
* data集合接口方法实现类
*/
@Service
public class DataServiceImpl implements IDataService {
@Autowired
private MongoTemplate mongoTemplate;
@Override
public List<Data> findByUuid(String uuid){
Query query = Query.query(Criteria.where("uuid").is(uuid));
List<Data> result = mongoTemplate.find(query,Data.class);
return result;
}
@Override
public Data findByUuidOne(String uuid){
Query query = Query.query(Criteria.where("uuid").is(uuid));
Data result = mongoTemplate.findOne(query,Data.class);
return result;
}
}
Spring Boot中快速操作Mongodb看这里:
Spring Boot中快速操作Mongodb-腾讯云开发者社区-腾讯云
另外今天在写前端时,使用elementui时,要注意组件想接收的数据是一个对象还是一个数组,定义的参数也不同,否则绑定数据的时候会报错。
此外今天还遇到一个情况:在后端未查询到数据,返回null到前端时,前端代码写错,导致dialog无法关闭。
test(id).then(response => {
console.log(response);
this.form = response.data;
})
上面这种写法会导致当后端未查到数据返回null时,响应数据的object里,没有data,只有msg和code。这样一来代码就会报错,停留在this.form = response.data;这一句中,所以dialog无法关闭。
添加一个简单的判断即可:
//注意判断条件不是response != null
//因为后端返回null,相应数据object还是存在,只是没有了data
test(id).then(response => {
if(response.data != null){
console.log(response);
this.form = response.data;
}
})
:data="test"为单项绑定,:model="test"为双向绑定