1.整合SpringBoot
1.1导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
1.2配置文件
spring:
data:
mongodb:
uri: mongodb://用户名:密码@ip(域名):27017/db_name?authSource=admin
1.3集合相关操作
@SpringBootTest
class MongoStudyApplicationTests {
//SpringBoot为我们提供了一个MongoTemplate,直接注入即可
@Autowired
private MongoTemplate mongoTemplate;
@Test
void Col() {
//创建一个集合,注意不能存在相同的集合,否则抛出异常
mongoTemplate.createCollection("col_1");
//判断一个集合是否已经存在
boolean exists = mongoTemplate.collectionExists("col_1");
//删除一个集合
mongoTemplate.dropCollection("col_1");
}
}
1.4文档操作
1.4.1相关注解
@Document
- 修饰范围:用在类上
- 作用:用来映射这个类的对象为mongo中的一条文档数据
- 属性: (value, collection) 用来指定操作的集合名称
@Id
- 修饰范围: 用在成员变量、方法上
- 作用:用来映射这个类的一个对象为文档的_id的值
@Field
- 修饰范围:用在成员变量、方法上
- 作用:用来将成员变量的值映射为文档的id值
- 属性:(name,value) 用来指定在文档中key的名称,默认为变量名
@Transient
- 修饰范围:用在成员变量、方法上
- 作用:用来指定修改成员变量,不参与文档的序列化
1.4.2测试数据
@Document("users")
public class User {
@Id
private Integer id;
@Field("username")
private String name;
@Field("salary")
private Double salary;
@Field("birthday")
private Date birthday;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", salary=" + salary +
", birthday=" + birthday +
'}';
}
public User() {
}
public User(Integer id, String name, Double salary, Date birthday) {
this.id = id;
this.name = name;
this.salary = salary;
this.birthday = birthday;
}
}
1.4.3插入
单条插入
@Test
void createDocu() {
User user = new User(1, "张三", 2323.3d, new Date());
/**
* insert()方法在_id存在时会报异常
*
* */
mongoTemplate.insert(user);
/**
* save()方法在_id存在时会更新数据,不会报错
*/
mongoTemplate.save(user);
}
批量插入
@Test
void createDocu() {
List<User> users = new ArrayList<>(Arrays.asList(new User(5, "张其", 232.3d, new Date()), new User(6, "王双", 2323.3d, new Date())));
/**
* insert()重载方法,传入一个集合,第二个参数是对象的Class
* 使用这个方法,User类上必须加@Document注解
* */
mongoTemplate.insert(users, User.class);
/**
* insert()重载方法,传入一个集合,第二个参数是集合的名字,
* 注意:集合名字一定要写对,写错会创建一个新的集合进行插入数据,不会报错
* */
mongoTemplate.insert(users, "users");
}
1.4.4查询
@SpringBootTest
class MongoStudyApplicationTests {
@Autowired
private MongoTemplate mongoTemplate;
@Test
void createDocu() {
/**
* 查询所有
* */
List<User> users1 = mongoTemplate.findAll(User.class);
//参数二:集合名称
List<User> users2 = mongoTemplate.findAll(User.class, "users");
List<User> users3 = mongoTemplate.find(new Query(), User.class);
/**
* 根据_id查询
* */
User user = mongoTemplate.findById(1, User.class);
/**
* > 等值查询
* > 通过使用Criteria构造条件,包装成一个Query()对象
* > 注意:这里的字段,可以写数据库中的,也可以写类中的
* > 查询 username = 张三
* */
Query conditionUsername = Query.query(Criteria.where("username").is("张三"));
List<User> users = mongoTemplate.find(conditionUsername, User.class);
/**
* > < >= <= 查询
* 查询 salary >= 2333
* */
Query conditionSalary = Query.query(Criteria.where("salary").gte(2333d));
List<User> users4 = mongoTemplate.find(conditionSalary, User.class);
/**
* > and查询
* > 查询 username = 张三 and salary = 2333
* */
Query query = Query.query(Criteria.where("username").is("张三").and("salary").is(2333d));
List<User> users5 = mongoTemplate.find(query, User.class);
/**
* > or查询
* > 查询username = 张三 or username = 李四
* */
Criteria criteria = new Criteria();
//参数是一个不定参数
criteria.orOperator(
Criteria.where("username").is("张三"),
Criteria.where("username").is("王双")
);
List<User> users6 = mongoTemplate.find(Query.query(criteria), User.class);
/**
* 排序 sort
* */
Query sortQuery = new Query();
sortQuery.with(Sort.by(Sort.Order.asc("salary"))); //asc升序 desc降序
List<User> users7 = mongoTemplate.find(sortQuery, User.class);
/**
* > 分页
* skip(n) 跳过前n条数据
* limit(k) 显示k条数据
* */
Query pageQuery = new Query();
pageQuery.skip(2).limit(3);
List<User> users8 = mongoTemplate.find(pageQuery, User.class);
/*
* 显示符合条件的记录数,传入一个Query()对象
* */
long count = mongoTemplate.count(new Query(), User.class);
/**
* 去重
* 参数一:查询条件
* 参数四:返回的结果类型
* */
List<String> username = mongoTemplate.findDistinct(new Query(), "username", User.class, String.class);
}
}
使用原生JSON字符串进行查询
@SpringBootTest
class MongoStudyApplicationTests {
@Autowired
private MongoTemplate mongoTemplate;
@Test
void createDocu() {
/*
* 原生JSON字符串进行查询
* */
BasicQuery basicQuery = new BasicQuery("{name:'张三', salary:2300}");
mongoTemplate.find(basicQuery, User.class);
}
}
1.4.5更新
@Test
void update() {
Update update = new Update();
//更新数据
update.set("username", "赵四");
//当调用upsert时没有数据匹配进行插入时,默认设置的数据
update.setOnInsert("_id", 232);
//更新符合条件的第一条数据
mongoTemplate.updateFirst(Query.query(Criteria.where("username").is("张三")), update, User.class);
//更新符合条件的所有数据
mongoTemplate.updateMulti(Query.query(Criteria.where("username").is("张三")), update, User.class);
//没有符合条件的数据时进行插入
UpdateResult updateResult = mongoTemplate.upsert(Query.query(Criteria.where("username").is("张三")), update, User.class);
//获取修改的行数
long modifiedCount = updateResult.getModifiedCount();
//获取匹配记录数
long matchedCount = updateResult.getMatchedCount();
//获取插入数据的_id值
BsonValue upsertedId = updateResult.getUpsertedId();
}
}
1.4.6删除
@Test
void delete() {
//条件删除
mongoTemplate.remove(Query.query(Criteria.where("username").is("张三")), User.class);
}