该文档适用于MongoDB数据库结合Java实际项目,适合刚接触的同学们尽快接触并上手开发
在学习新的知识时,请一定要放松心情,切勿被出现的错误和耽误的时间扰乱思绪,多看源码;紧张时请与心爱的人聊聊天,转换思路;网上查不到的写法请在源码中寻找答案,版本不同差别较大!
安装教程地址:Windows10安装MongoDB图文详解
例,使用idea创建项目时,可直接在nosql选项中选择添加MongoDB;生成SpringBoot项目后,pom.xml文件自带spring-boot-starter-data-mongodb。
@Configuration
public class MongoConfiguration {
@Resource
private MongoDatabaseFactorySupport mongoDatabaseFactorySupport;
@Resource
private MappingMongoConverter mappingMongoConverter;
@Bean
public MongoTemplate mongoTemplate() {
mappingMongoConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
MongoTemplate mongoTemplate = new MongoTemplate(mongoDatabaseFactorySupport, mappingMongoConverter);
return mongoTemplate;
}
}
重写MongoTemplate,并使用@Bean注解注入到程序中,在具体使用CRUD方法时,在该类中引用MongoTemplate。
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = "vibration_realtime_data") //指定文档名(表名)
public class VibrationRealTimeData {
@Field(value = "tag_name")
private String tagName;
@Field(value = "real_time")
private String realTime;
}
1.一定要写上@Document(collection = "文档名/表名")注解,代表该类是MongoDB数据库的某个文档(表)的实体类;collection代表具体的文档名/表名"。
2.在字段名称上添加@Field(value = "tag_name")注解,代表该属性对应文档(表)的某个字段;value代表具体的字段名称。
spring:
data:
mongodb:
uri: mongodb://127.0.0.1:27017/online_spotcheck?appName=MongoDB+Compass&directConnection=true&serverSelectionTimeoutMS=2000
mongodb://IP:端口号/数据库名称,问号后边的美容根据实际情况,可写可不写。
@Test
void insertDataTest(){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
VibrationRealTimeData vibrationRealTimeData = new VibrationRealTimeData();
vibrationRealTimeData.setTagName("TG_TEST1");
vibrationRealTimeData.setRealTime(simpleDateFormat.format(new Date()));
mongoTemplate.insert(vibrationRealTimeData,"vibration_realtime_data");
}
1.insert方法使用实体类和表名称两个参数的方法,源码如下否则会出现代码不会报错,但数据不能插入到文档名(表)中,必须要有相对应的文档名/表名。
/*
* (non-Javadoc)
* @see org.springframework.data.mongodb.core.MongoOperations#insert(java.lang.Object, java.lang.String)
*/
@Override
@SuppressWarnings("unchecked")
public <T> T insert(T objectToSave, String collectionName) {
Assert.notNull(objectToSave, "ObjectToSave must not be null!");
Assert.notNull(collectionName, "CollectionName must not be null!");
ensureNotIterable(objectToSave);
return (T) doInsert(collectionName, objectToSave, this.mongoConverter);
}
2.数据插入成功后 查看MongoDB对应的文档名/表,会显示
注:id在没有自定义的情况下,由数据库系统自创自增。
@Test
void queryDataTest(){
VibrationRealTimeData vibrationRealTimeData = new VibrationRealTimeData();
vibrationRealTimeData.setTagName("TG_TEST1");
Query query = new Query(Criteria.where("tag_name").is(vibrationRealTimeData.getTagName()));
System.out.println(mongoTemplate.find(query, VibrationRealTimeData.class,"vibration_realtime_data"));
}
1.query引包import org.springframework.data.mongodb.core.query.Query;先确定查询的方式,生成查询条件;例如,本次使用文档/表中的“tag_name”字段,确定字段值,使用find方法查询数据。
2.find方法要使用带查询条件,实体类,文档/表名三个参数的方法,源码如下;
@Override
public <T> List<T> find(Query query, Class<T> entityClass, String collectionName) {
Assert.notNull(query, "Query must not be null!");
Assert.notNull(collectionName, "CollectionName must not be null!");
Assert.notNull(entityClass, "EntityClass must not be null!");
return doFind(collectionName, query.getQueryObject(), query.getFieldsObject(), entityClass,
new QueryCursorPreparer(query, entityClass));
}
3.查询成功后,会显示全部数据
注:当查询字段值重复时使用findOne方法(参数同find),系统也不会报错,MongoDB数据库会自动返回插入时间最早的数据。
@Test
void deleteDataTest(){
VibrationRealTimeData vibrationRealTimeData = new VibrationRealTimeData();
vibrationRealTimeData.setTagName("TG_TEST1");
Query query = new Query(Criteria.where("tag_name").is(vibrationRealTimeData.getTagName()));
// remove 方法会将全部相同地查询主键数据全部删除 所以请保证查询字段数据的唯一性 防止误删除
mongoTemplate.remove(query,VibrationRealTimeData.class,"vibration_realtime_data");
}
1.remove方法的写与find方法大致相同,先确定查询的主字段;
2.使用三个参数的remove方法;
注:remove 方法会将全部相同地查询主键数据全部删除 所以请保证查询字段数据的唯一性 防止误删除。
1. 在查询中系统出现报错Query failed with error code 2 with name 'BadValue' and error message 'Field 'locale' is invalid in: { locale: "vibration_realtime_data" }' on server 127.0.0.1:27017; nested exception is com.mongodb.MongoQueryException: Query failed with error code 2 with的主要原因
答:需要注意实体类中的注解
该注解中"collection"和” collation”是两个功能不同的注解,一定要注意;源码如下:
The collection the document representing the entity is supposed to be stored in. If not configured, a default collection name will be derived from the type's name. The attribute supports SpEL expressions to dynamically calculate the collection to based on a per operation basis.
Returns:
the name of the collection to be used.
翻译:表示实体的文档应该存储在其中的集合中。如果未配置,则从类型的名称派生默认集合名称。该属性支持SpEL表达式,以根据每个操作的基础动态计算集合。
返回:
要使用的集合的名称。
Defines the collation to apply when executing a query or creating indexes.
Returns:
an empty String by default.
Since:
2.2
翻译:定义在执行查询或创建索引时应用的排序规则。
返回:
默认为空字符串。
自:
2.2