一、开启mongodb认证模式
1.用户常用权限
1.1 read
适用范围:指定数据库。
权限:允许用户读取指定数据库中的数据。
1.2 readWrite
适用范围:指定数据库。
权限:允许用户读取和写入指定数据库中的数据。
1.3 dbAdmin
适用范围:指定数据库。
权限:允许用户管理(包括创建和删除)指定数据库中的集合和索引。
1.4 dbOwner
适用范围:指定数据库。
权限:允许用户在指定数据库上执行任意操作,相当于拥有该数据库的所有权限。
1.5 userAdmin
适用范围:指定数据库。
权限:允许用户管理指定数据库中的用户和角色。
1.6 clusterAdmin
适用范围:整个集群。
权限:允许用户在整个 MongoDB 集群上执行任意操作,包括管理其他用户、设置复制集和分片等。
1.7 readAnyDatabase
适用范围:所有数据库。
权限:允许用户在任意数据库上进行读取操作。
1.8 readWriteAnyDatabase
适用范围:所有数据库。
权限:允许用户在任意数据库上进行读写操作。
1.9 userAdminAnyDatabase
适用范围:所有数据库。
权限:允许用户在任意数据库上管理用户和角色。
1.10 dbAdminAnyDatabase
适用范围:所有数据库。
权限:允许用户在任意数据库上执行管理操作(集合和索引)。
1.11 root
适用范围:整个 MongoDB 实例。
权限:root 是 MongoDB 中的超级用户角色,拥有集群中所有数据库的完全访问权限。root 用户可以执行任何操作,包括创建、删除数据库,管理用户和角色,设置权限等。该角色相当于 MongoDB 的管理员用户,应当谨慎授权给需要执行集群范围内最高级别操作的用户。
2.创建用户
db.creatUser({user:"mbb",pwd:"mbb",roles["root"]})
3.开启用户登录认证
mongod --auth --dbpath D:\MongoDB\data\db
4.用户登录操作
mongosh -u mbb -p mbb --authenticationDatabase admin
二、springBoot集成mongodb
1.引入对应jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.6.0</version>
</dependency>
2.配置yml
data:
mongodb:
uri: mongodb://mbb:mbb@127.0.0.1:27017/test?authSource=admin
# 等同于url
# database: test
# host: 127.0.0.1
# port: 27017
# username: mbb
# password: mbb
# authentication-database: admin
3.集合操作
3.1控制层
@GetMapping("test")
public ResultJson mongodbTestInsert(@RequestParam(value = "name") String name){
mongodbUtil.createCollection(name);
return new ResultJson(StatusCode.OK);
}
3.2工具类
//注意一旦我们注入spring管理的bean,我们就需要把对应类注册给spring管理,才能够进行bean的注入
@Component
@Slf4j
public class MongodbUtil {
@Resource
private MongoTemplate mongoTemplate;
//集合创建
public Boolean createCollection(String collectionName) {
boolean b = mongoTemplate.collectionExists(collectionName);
if (b) {
return true;
}
try {
mongoTemplate.createCollection(collectionName);
return true;
} catch (Exception e) {
log.error("创建集合失败:" + e.getMessage());
return false;
}
}
//集合删除
public Boolean dropCollection(String name){
try {
mongoTemplate.dropCollection(name);
}catch (Exception e){
return false;
}
return true;
}
}
4.文档操作
4.1 相关注解
4.1.1 @Document:
意思:@Document 注解用于指定一个类是 MongoDB 的文档,即该类的对象会被存储到指定的集合中。可以用于类级别
4.1.2 @Id/@MongoId
意思:@Id 注解用于指定一个字段作为文档的主键。MongoDB 中的文档必须有一个唯一的主键 _id,可以是任何类型,通常是 String 或 ObjectId。
4.1.3 @Field
意思:@Field 注解用于指定类的字段与 MongoDB 文档中的字段的映射关系。如果字段名与文档字段名相同,则可以省略该注解。
4.1.4 @Indexed
意思:@Indexed 注解用于在 MongoDB 中为字段创建索引,以提高查询性能。
4.1.5 @DBRef:
意思:@DBRef 注解用于实现关联关系,允许在文档中存储其他文档的引用。在查询时,可以自动解析这些引用。
4.1.6 @Transient:
意思:@Transient 注解用于指定字段不会被存储到 MongoDB 中,即该字段会被忽略。
@Document("user")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@MongoId
private Integer id;
@Field("username")
private String name;
@Field
private String sex;
@Field
private int age;
}
4.2 文档新增
//当Id存在就覆盖,不存在就新增
// mongoTemplate.save(new User(1,"mbb","男",25));
//id存在抛出异常 com.mongodb.MongoWriteException
// mongoTemplate.insert(new User(1,"mbb","男",25));
//insert可以批量插入
List<User> userList = Arrays.asList(
new User(2,"张三","男",25),
new User(3,"李四","男",24),
new User(4,"王五","男",50),
new User(5,"刘六","男",30),
new User(6,"黄芪","女",22)
);
mongoTemplate.insert(userList, User.class);
}
4.3 文档查询
4.3.1 基础查询
//查询所有数据
List<User> userList = mongoTemplate.findAll(User.class);
userList.forEach(System.out::println);
System.out.println("=====================");
List<User> userList1 = mongoTemplate.find(new Query(), User.class);
userList1.stream().forEach(System.out::println);
System.out.println("----------------------");
//根据Id查询
User user = mongoTemplate.findById(1, User.class);
System.out.println("ID为" + 1 + "用户信息:" + user);
System.out.println("++++++++++++++++++++++");
//查询出来多个返回第一个文档
User one = mongoTemplate.findOne(new Query(), User.class);
System.out.println("第一个用户信息:" + user);
System.out.println("!!!!!!!!!!!!!!!!!!!!!!");
//条件查询年龄大于等于30
List<User> userList2 = mongoTemplate.find(new Query(Criteria.where("age").gte(30)), User.class);
userList2.stream().forEach(System.out::println);
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@");
//年龄大于20小于50
List<User> userList3 = mongoTemplate.find(new Query(Criteria.where("age").gt(20).lt(50)), User.class);
userList3.stream().forEach(System.out::println);
System.out.println("#####################");
//正则查询(模糊查询)名字含有张性别
List<User> userList4 = mongoTemplate.find(new Query(Criteria.where("name").regex("张")), User.class);
userList4.stream().forEach(System.out::println);
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$");
//and 查询性别男,年龄大于25的
Criteria criteria = new Criteria();
criteria.andOperator(Criteria.where("sex").is("男"),Criteria.where("age").gt(25));
Query query = new Query();
query.addCriteria(criteria);
//排序处理 + 分页处理
query.with(Sort.by(Sort.Order.desc("id")))
.skip(0) //指定跳过记录数
.limit(1); //查询条数
List<User> userList5 = mongoTemplate.find(query, User.class);
userList5.stream().forEach(System.out::println);
4.3.2 使用JSON查询
//使用json字符串进行查询
//等值查询
//String json = "{name:'张三'}";
//多条件查询
String json = "{$or:[{sex:'男'},{age:{$gt:30}}]}";
Query query = new BasicQuery(json);
List<User> userList = mongoTemplate.find(query, User.class);
userList.stream().forEach(System.out::println);
4.4 更新文档
updateFirst:更新匹配查询条件的第一个文档
updateMany:更新匹配查询条件的所有文档
upsert:有就修改,无就新增
//设置查询条件
Query query = new Query(Criteria.where("sex").is("男"));
mongoTemplate.find(query, User.class).forEach(System.out::println);
System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!");
Update update = new Update();
update.set("age",99);
//updateFirst:更新匹配查询条件的第一个文档
mongoTemplate.updateFirst(query,update, User.class);
mongoTemplate.find(query, User.class).forEach(System.out::println);
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
//updateMany:更新匹配查询条件的所有文档
mongoTemplate.updateMulti(query,update, User.class);
mongoTemplate.find(query, User.class).forEach(System.out::println);
System.out.println("############################");
//upsert:有就修改,无就新增
Query query1 = new Query(Criteria.where("age").is("130"));
Update update1 = new Update();
update1.setOnInsert("id",7);
mongoTemplate.upsert(query1,update1, User.class);
mongoTemplate.find(new Query(), User.class).forEach(System.out::println);
4.5 删除文档
//我们删除所有数据可以直接用集合删除 mongoTemplate.dropCollection(name/对象类.class)
//mongoTemplate.remove(new Query(), User.class); //删除所有数据
mongoTemplate.find(new Query(),User.class).forEach(System.out::println);
System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
//按条件删除
Query query = new Query(Criteria.where("age").gte(99));
mongoTemplate.remove(query, User.class);
mongoTemplate.find(new Query(),User.class).forEach(System.out::println);
下一篇是聚合查询,不足之处望海涵;