下载地址:传送阵
高级设置= 》配置环境变量
打开cmd窗口,输入mongod
但提示找不到c:\data\db,所以我们要去c盘创建一个data文件夹里面并创建db文件夹,这个路径是默认的数据库的存储路径
则启动成功,其中mongodb的默认端口是27017
客户端启动 ,重新打开一个cmd命令窗口,输入mongo即可
使用Navicat连接mongodb
集成springboot
添加依赖
<!--mongodb 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
配置
spring:
data:
mongodb:
uri: mongodb://localhost:27017/test
使用
创建角色 :db.createUser({user:"root",pwd:"123456",roles:["readWrite"]})
@Autowired
private MongoTemplate mongoDbJavaTest;
插入数据
public void mongoDbJavaSave(){
List<MongoDbJavaTest> list = new ArrayList<>();
mongoDbJavaTest.setName("admin");
mongoDbJavaTest.setRemarks("测试");
list.add(mongoDbJavaTest);
// 保存对象到mongodb
mongoTemplate.save(mongoDbJavaTest);
mongoTemplate.insert(mongoDbJavaTest);
// 根据集合名称保存对象到mongodb
mongoTemplate.save(mongoDbJavaTest,"mongodb_java_test");
mongoTemplate.insert(mongoDbJavaTest,"mongodb_java_test");
// 根据集合名称保存list到mongodb
mongoTemplate.save(list,"mongodb_java_test");
mongoTemplate.insert(list,"mongodb_java_test");
mongoTemplate.insert(list,MongoDbJavaTest.class);
}
更新数据
mongoDbJavaTest.setId("5d1312aeb1829c279c6c256b");
mongoDbJavaTest.setName("admin");
mongoDbJavaTest.setRemarks("测试");
Query query = Query.query(Criteria.where("_id").is("5d1312aeb1829c279c6c256b"));
Update update = Update.update("name","admin");
// 更新一条数据
mongoTemplate.updateFirst(query,update, MongoDbJavaTest.class);
mongoTemplate.updateFirst(query,update, "mongodb_java_test");
mongoTemplate.updateFirst(query,update, MongoDbJavaTest.class,"mongodb_java_test");
// 根据实体更新
mongoTemplate.update(mongoDbJavaTest.getClass());
// 更新多条数据
mongoTemplate.updateMulti(query,update, MongoDbJavaTest.class);
mongoTemplate.updateMulti(query,update,"mongodb_java_test");
mongoTemplate.updateMulti(query,update, MongoDbJavaTest.class,"mongodb_java_test");
// 更新数据,如果数据不存在就新增
mongoTemplate.upsert(query,update, MongoDbJavaTest.class);
mongoTemplate.upsert(query,update,"mongodb_java_test");
mongoTemplate.upsert(query,update, MongoDbJavaTest.class,"mongodb_java_test");
删除
public void mongoDbJavaRemove(){
List<MongoDbJavaTest> list = new ArrayList<>();
mongoDbJavaTest.setId("5d1312aeb1829c279c6c256b");
list.add(mongoDbJavaTest);
Query query = Query.query(Criteria.where("_id").in("5d1312aeb1829c279c6c256b","5d13133ab1829c29d02ce29c"));
// 根据条件删除
mongoTemplate.remove(query);
mongoTemplate.remove(mongoDbJavaTest);
mongoTemplate.remove(MongoDbJavaTest.class);
// 根据条件删除(可删除多条)
mongoTemplate.remove(query,CarryUserInfo.class);
mongoTemplate.remove(query,MongoDbJavaTest.class,"mongodb_java_test");
}
常用方法
添加文档主要介绍两种方式:
mongoTemplate.insert("实体对象","集合名"); 往集合插入数据的方式
mongoTemplate.save(对象,集合名(可省略)); 参数必须是对象
insert和save都适用
不写集合名,默认对象类名作为集合名(如实体类是A 集合名是a)
写集合名,则把数据写到对应集合下
1.void save(Object var1); 传入对象,不传集合名
2.void save(Object var1, String var2); 传入对象,传集合名
3.void insert(Object var1); 传入对象,不传集合名
4.void insert(Object var1, String var2); 传入对象,传集合名
5.void insert(Collection<? extends Object> var1, Class<?> var2);
下面三个方法是批量插入的实现方法
6.void insert(Collection<? extends Object> var1, String var2);
7.void insertAll(Collection<? extends Object> var1);
查询mongodb的操作:
find 和findone方法都有两种实现
1.List<T> find(Query var1, Class<T> var2) 不指定集合名
2.List<T> find(Query var1, Class<T> var2, String var3) 指定集合名
3.<T> T findOne(Query var1, Class<T> var2); 不指定集合名
4.<T> T findOne(Query var1, Class<T> var2, String var3);指定集合名
eg。
maxvalue在数据库中就对应一个集合,可以不指定集合名直接查询
Sl6512014 在数据对应很多集合 必须知道集合名才能查询出数据
*
findall
1.<T> List<T> findAll(Class<T> var1); 根据类型查询所有
2.<T> List<T> findAll(Class<T> var1, String var2); 查询集合下的该类型数据
findById:
<T> T findById(Object var1, Class<T> var2); var1 是mongodb的_id子段值
<T> T findById(Object var1, Class<T> var2, String var3); 指定集合名
更新操作:
updateFirst 更新符合条件的第一条 updateMulti 更新多个,符合条件都会更改
//修改第一条符合条件数据
1.WriteResult updateFirst(Query var1, Update var2, Class<?> var3); 指定类型
2.WriteResult updateFirst(Query var1, Update var2, String var3); 更新操作指定集合名
3.WriteResult updateFirst(Query var1, Update var2, Class<?> var3, String var4); 详细指定类型和集合名
//批量修改
4.WriteResult updateMulti(Query var1, Update var2, Class<?> var3); 指定类型
5.WriteResult updateMulti(Query var1, Update var2, String var3); 指定集合名
6.WriteResult updateMulti(Query var1, Update var2, Class<?> var3, String var4); 详细指定类型和集合名
//同updateFirst
7.WriteResult upsert(Query var1, Update var2, Class<?> var3);
8.WriteResult upsert(Query var1, Update var2, String var3);
9.WriteResult upsert(Query var1, Update var2, Class<?> var3, String var4);
删除操作:
1.WriteResult remove(Object var1);
2.WriteResult remove(Object var1, String var2);
3.WriteResult remove(Query var1, Class<?> var2); 根据条件删除
4.WriteResult remove(Query var1, Class<?> var2, String var3); 详细指定类型和集合名进行删除
5.WriteResult remove(Query var1, String var2); 指定集合名进行删除
其他一些操作:简单介绍:
//查询出后删除
<T> List<T> findAllAndRemove(Query var1, String var2); 指定集合名
<T> List<T> findAllAndRemove(Query var1, Class<T> var2); 指定类型
<T> List<T> findAllAndRemove(Query var1, Class<T> var2, String var3); 在集合下查询删除的类型数据
//查处后修改
<T> T findAndModify(Query var1, Update var2, Class<T> var3); 指定修改类型
<T> T findAndModify(Query var1, Update var2, Class<T> var3, String var4); 在集合下修改的数据类型
<T> T findAndModify(Query var1, Update var2, FindAndModifyOptions var3, Class<T> var4);
<T> T findAndModify(Query var1, Update var2, FindAndModifyOptions var3, Class<T> var4, String var5);
<T> T findAndRemove(Query var1, Class<T> var2);
<T> T findAndRemove(Query var1, Class<T> var2, String var3);
//判断是否存在
boolean exists(Query var1, String var2);
boolean exists(Query var1, Class<?> var2);
boolean exists(Query var1, Class<?> var2, String var3);
is相当于等于
in相当于sql中的in
ne相当于不等于
orOperator接受多个条件,组成or逻辑 addOperator同理
Criteria.where("author").is("mongodb") author = mongodb的数据
Criteria.where("serial").lte(500).and("st").is("1703230781").and("c").in("5.7") 多条件的查询
Criteria.where("st").exists(true) 判断这个字段存在
Criteria.where("serial").ne(1) 不等于1的数据
Criteria.where("serial").nin(1) nin 不在这个范围中
Criteria.where("serial").is(3).orOperator().is().andOperator() 追加or条件或者and条件
Criteria.where("a").regex("1") 模糊查询 可以用正则表达式
query6.with(new Sort(Sort.Direction.DESC,"a")); 按照a字段把结果降序
query6.skip(n); 跳过结果集的第n个 超过总条数就是啥都不输出 n<=0 时 查询到结束不跳过
query6.skip(n).limit(m) 跳过n条并显示m条记录
query6.addCriteria(Criteria.where("b").is("11")); 再加条件 查询子段不能是上一个query查询过的子段
query6.maxScan(6).skip(-2); 先截取六条数据再跳过两条
分页查询 query.with(new PageRequest(1, 5));
DBObject dbObject = new BasicDBObject();
//dbObject.put("name", "zhangsan"); //查询条件
BasicDBObject fieldsObject=new BasicDBObject();
//指定返回的字段
fieldsObject.put("name", true);
fieldsObject.put("age", true);
fieldsObject.put("sex", true);
Query query = new BasicQuery(dbObject,fieldsObject);
List<Person> user = mongoTemplate.find(query, Person.class);
常用注解
注解
@Id
主键,不可重复,自带索引,可以在定义的列名上标注,
需要自己生成并维护不重复的约束。如果自己不设置@Id主键,
mongo会自动生成一个唯一主键,并且插入时效率远高于自己设置主键。
原因可参考上一篇mongo和mysql的性能对比。
@Document(collection = "sys_user")
注解@JsonFormat:后端格式化日期后返回给前端
注解 @Builder.Default:设置默认值
注解@DBRef:设置对象的关联
注解@JsonIgnore:后端返回给前端时忽略此字段
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
注解@Transient:此字段不会映射到数据库 被该注解标注的,将不会被录入到数据库中。只作为普通的javaBean属性。
给映射存储到 mongodb 的字段取别名
在 java bean 中字段名为 firstName,存储到 mongo 中 key 为 fName
@Field("fName")
private String firstName;
@Indexed
声明该字段需要加索引,加索引后以该字段为条件检索将大大提高速度。
唯一索引的话是@Indexed(unique = true)。
也可以对数组进行索引,如果被索引的列是数组时,MongoDB会索引这个数组中的每一个元素。
也可以对整个Document进行索引,排序是预定义的按插入BSON数据的先后升序排列。
也可以对关联的对象的字段进行索引,譬如User对关联的address.city进行索引。(注解怎么写还不清楚,待查)
注解 不获取 0 Doc实体类的password 字段 1相反获取的字段 用在接口方法上面
@Query(fields = "{ 'password' : 0}")
List<Doc> findByType(String type, Pageable pageable);
Spring boot集成mongodb使用MongoRepository完成,增,删,改,查 操作
public interface YxMemberMongodbService extends MongoRepository<YxUser,String> {
}
好了,就完成了
有几点需要注意一下
1、findOne()方法的替代方法findById()
2.0版本,Spring-Data-Jpa修改findOne()。
1)2.0版本之前
T findOne(ID primaryKey);
2)2.0版本
Optional<T> findById(ID id);
2、Optional Optional<T>的使用
文档:Optional
container对象,可能包含也可能不包含非null值。如果存在值,则isPresent()将返回true,get()将返回该值。提供依赖于是否存在包含值的其他方法,例如orElse()(如果值不存在则返回默认值)和ifPresent()(如果值存在则执行代码块)。
Optional<T> findById(ID id)中Optional的一些用法:
1)如果没找到指定实体,则返回一个默认值。
Foo foo = repository.findById(id)
.orElse(new Foo());
或者
Foo foo = repository.findById(id)
.orElse(null);
2)如果找到实体返回它,否则抛出异常
return repository.findById(id)
.orElseThrow(() -> new EntityNotFoundException(id));
3)假设希望根据是否找到实体来应用不同的处理(无需抛出异常)
Optional<Foo> fooOptional = fooRepository.findById(id);
if (fooOptional.isPresent()){
Foo foo = fooOptional.get();
// 处理 foo ...
}
else{
//另一种情况....
}
还有修改数据
save方法
insert方法
区别:
进行数据添加操作时,使用insert:方法,当主键在集合中存在时,不做任何处理, 抛异常
使用save方法时,当主键在集合中存在时,会进行更新, 数据整体都会更新 ,新数据会替换掉原数据 ID 以外的所有数据。ID 不存在则新增一条数据
进行数据添加操作时,save 方法需要遍历列表,一个个插入, 而 insert 方法是直接批量插入
基本的使用这个博客讲的不错
地址:https://www.jianshu.com/p/f47621a224a6
至此完成