MongoDB记录是一个文档,由一个字段和值对组成的数据结构,文档类似于JSON对象。
一个文档认为就是一个对象,字段的数据类型是字符型,值除了使用基本类型外,还可以包括其他文档,普通数组和文档数组。
一、下载安装、解压、创建存放数据文件的目录data/db
①、window安装
启动方式:
- 命令行参数方式启动,bin目录下打开命令提示符:mongod --dbpath=...\data\db 默认端口27017,可以通过--port来指定端口
- 配置文件方式启动,在解压目录中创建config文件夹,该文件夹中新建配置文件mongod.conf
②、Linux中通过docker安装
bash
docker pull mongo:latest
# 创建和启动容器
docker run -d --restart=always -p 27017:27017 --name mymongo -v /data/db:/data/db -d mongo
# 查看
docker ps
# 进入容器
docker exec -it mymongo /bin/bash
# 使用客户端进行操作
mongo
# 查询当前mogodb中有哪些数据库
show dbs
=========================================================================
命令行进行连接:
图形化界面进行连接:
Linux系统中进行安装、启动、连接
==============================================================
基本常用命令
创建一个集合(table)
bash
db.createCollection("collName")
# 得到指定名称的集合
db.getCollection("user")
向comment集合中插入一条数据并查询
bash
db.User.save({name:'jordan',age:23,sex:true})
db.User.find() #查询所有
db.User.find({name:"jordan"}) #查询指定名字的数据
db.User.find({age:23},{'name':1,'age':1}) #查询age=23的,只显示name/age字段
db.User.createIndex({"name":1}) # 添加索引
如果comment不存在,则会隐式创建
数字默认是double类型,如果存整型,需要函数NumberInt()
插入的数据没有指定_id,会自动生成主键值
如果某字段没有值,可以赋值为null,或不写该字段
yml
db.comment.insert(
{
"articleid":"100000",
"content":"今天天气好晴朗,处处好风光",
"userid":"1001",
"nickname":"Rose",
"createdatetime":new Date(),
"likenum":NumberInt(10),
"state":null
}
)
批量插入
如果某条数据插入失败,将会终止插入,但已经插入成功的数据不会回滚掉。
可以使用try{...}catch(e){print(e);}
yml
db.comment insertMany(
[
{"_id":"1","articleid":"100001","content":"天气晴朗","userid":"10002","nickname":"jordan","createdatetime":new Date("2008-08-01"),"likenum":NumberInt(1000),"state":"1"},
{},
{}
]
)
投影查询(只查询部分字段)
yml
db.comment.find(
{userid:"1003"},
{userid:1,nickname:1}
)
排序
bash
#1为升序排列,-1为降序排列
db.User.find().sort({age:1})
文档更新
yml
# 覆盖修改,修改_id为1,点赞量为1001
db.comment.update({_id:"1"},{likenum:NumberInt(1001)})
# 局部修改,修改_id为2,浏览量为889
db.comment.update({_id:2},{$set:{likenum:NumberInt(889)}})
# 批量修改,更新所有用户为1003的用户的昵称
db.comment.update({userid:"1003"},{$set:{nickname:"jordan"}}) # 默认只修改一条数据
db.comment.update({userid:"1003"},{$set:{nickname:"jordan"}},{multi:true}) # 修改所有符合条件的数据
# 列值增长的修改,对原有值的基础上进行增加或减少,可以使用$inc运算符
# 对3号数据的点赞数,每次递增1
db.comment.update({_id:"3"},{$inc:{linknum:NumberInt(1)}})
分页查询
yml
db.comment.find().limit(3) # 查询3条记录,默认值20
db.comment.find().skip(3) # 跳过3条记录,默认值0
# 每页2个
db.comment.find().skip(0).limit(2) # 第一页
db.comment.find().skip(2).limit(2) # 第二页
db.comment.find().skip(4).limit(2) # 第三页
正则表达式实现的模糊查询
yml
# 内容评论包含开水打的所有文档
db.comment.find({content:/开水/})
# 以专家开头的评论内容
db.comment.find({content:/^专家/})
比较查询
yml
# 评论点赞数大于700
db.comment.find({linenum:{$gt:NumberInt(700)}})
包含查询
yml
# 查询评论集合中userid字段包含1003或1004的文档
db.comment.find({userid:{$in:["1003","1004"]}})
# 不好含使用$nin操作符 查询集合中suerid字段不包含1003和1004的文档
db.comment.find({userid:{$nin:["1003","1004"]}})
条件连接查询
yml
# 查询评论集合中likenum大于等于700并且小于2000的文档 $and:[{},{}]
db.comment.find({$and:[{likenum:{$gte:NumberInt(700)}},{likenum:{$lt:NumberInt(2000)}}]})
# 或 $or:[{},{}] 查询评论集合中userid为1003,或者点赞数小于1000的文档记录
db.comment.find({$or:[{userid:"1003"},{likenum:{$lt:1000}}]})
删除操作
bash
db.User.remove(id) # 按照指定id移除
db.User.remove() #移除所有
总结:
====================================================================
创建索引
yml
# 单字段索引,对userid字段建立索引
db.comment.createIndex({userid:1})
# 复合字段索引,对userid和nickname同时建立复合索引
db.comment.createIndex({userid:1,nickname:-1})
移除索引
yml
# 删除userid字段上的升序索引
db.comment.dropIndex({userid:1})
# 删除所有索引(_id的字段是无法删除的,只能删除非_id字段的索引)
db.comment.dropIndexes()
执行计划
yml
# 根据userid查询数据的情况,建立的索引是否有效,效果如何
db.comment.find({userid:"1003"}).explain()
=================================================
MongoDB集群和安全
副本集的创建
一、创建主节点
二、创建副本节点
三、创建仲裁节点
四、初始化配置副本集和主节点
五、查看副本集的配置内容和副本集的状态
六、添加副本节点
七、添加冲裁节点
八、数据的读写
故障测试
=========================================================
SpringBoot集成mongodb
spring-data-mongodb提供了两种方式访问mongodb
①、MongoTemplate
②、MongoRepository 不够灵活,所以MongoTemplate弥补了不足
一、添加依赖
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
二、application.properties配置文件添加连接信息
bash
spring.data.mongodb.uri=mongodb://47.93.118.241:27017/test
三、创建对应的实体类
java
@Data
@Document("User") //指定对应的mongodb对应的
public class User{
@Id
private String id;
private String name;
private Integer age;
private String email;
private String createData;
}
四、测试
通过MongoTemplate实现对MongoDB的CRUD
java
@SpringBootTest
public class DemomogoApplicationTests{
@Autowired
private MongoTemplate mongoTemplate;
//添加操作
@Test
public void create(){
User user = new User();
user.setAge(20);
user.setName("jordan");
user.setEmail("jordan@qq.com");
User user = mongoTemplate.insert(user);//返回添加后的数据
}
//查询所有记录
@Test
public void findAll(){
List<User> all = mongoTemplate.findAll(User.class);
System.out.println(all);
}
//根据id查询
@Test
public void findById(){
User user = mongoTemplate.findById("id",User.class);
}
//条件查询
@Test
public void findUserList(){
Query query = new Query(Criteria.where("name").is("jordan").and("age").is(23));
mongoTemplate.find(query,User.class);
}
//模糊查询
@Test
public void findLikeUserList(){
String name = "jor";
String regex = String.format("%s%s%s","^.*",name,".*$");
Pattern pattern = Pattern.compile(regex.Pattern.CASE_INSENSTIVE);
Query query = new Query(Criteria.where("name").regex(pattern));
mongoTemplate.find(query,User.class);
}
//分页查询
@Test
public void findPageUserList(){
int pageNo = 1; //当前页
int pageSize = 3; //每页显示数
String name = "jor";
String regex = String.format("%s%s%s","^.*",name,".*$");
Pattern pattern = Pattern.compile(regex.Pattern.CASE_INSENSTIVE);
Query query = new Query(Criteria.where("name").regex(pattern));
//分页构建
//查询记录数(当前页=(pageNo - 1)*pageSize)
long count = mongoTemplate.count(query,User.class);
List<User> users = mongoTemplate.find(query,skip((pageNo - 1)*pageSize).limit(pageSize),User.class);
}
//修改操作
@Test
public void updateUser(){
//1.根据id查询
User user = mongoTemplate.findById("id",User.class);
//2.设置修改值
user.setName("kobe");
user.setAge(24);
user.setEmail("kobe@qq.com");
//3.调用方式实现修改
Query query = new Query(Criteria.where("_id").is(user.getId()));
Update update = new Update();
update.set("name",user.getName());
update.set("age",user.getAge());
update.set("email",user.getEmail());
UpdateResult upsert = mongoTemplate.upsert(query,update,User.class);
long modifiedCount = upsert.getModifiedCount();//影响的行数
}
//删除操作
@Test
public void deleteUser(){
Query query = new Query(Criteria.where("_id").is("id获取"));
DeleteResult remove = mongoTemplate.remove(query,User.class);
long deletedCount = remove.getDeleteCount();
System.out.println(deletedCount);
}
}
通过MongoRepository实现对MongoDB的CRUD
SpringData提供了对mongodb的数据访问支持,只需要继承MongoRepository
①、创建一个接口继承MongoRepository
java
public interface UserRepository extends MongoRepository<User,String>{
}
②、将上面的接口注入到业务类中
java
@Autowired
private UserRepository userRepository;
//添加操作
@Test
public void create(){
User user = new User();
user.setAge(16);
user.setName("james");
user.setEmail("james.qq.com");
User u = userRepository.save(user);
}
//查询所有
@Test
public void findId(){
List<Uer> all = userRepository.findAll();
}
//根据id查询
@Test
public void findId(){
User user = userRepository.findById("id值").get();
}
//条件查询
@Test
public void findUserList(){
User user = new User();
user.setAge(23);
user.setName("jordan");
Example<User> userExample = Example.of(user);
List<User> all = userRepository.findAll(userExample);
}
//模糊查询
@Test
public void findLikeUserList(){
//设置模糊查询的匹配规则(设置模糊查询,忽略大小写)
ExampleMatcher matcher = ExampleMatcher.matching()
.withStringMatcher(ExampleMather.StringMatcher.CONTAINING)
.withIgnoreCase(true);
User user = new User();
user.setAge(23);
user.setName("jor");
Example<User> userExample = Example.of(user,matcher);
List<User> all = userRepository.findAll(userExample);
}
//分页查询
@Test
public void findPageUserList(){
//设置分页参数
//0代表第一页
Pageable pageable = PageRequest.of(0,3);
User user = new User();
user.setName("jordan");
Example<User> userExample = Example.of(user);
Page<User> page = userRepository.findAll(userExample,pageable);
page.getTotalPages();//总页数
}
//修改
@Test
public void updateUser(){
User user = userRepository.findById("id值").get();
user.setAge(100);
user.setName("jordan");
user.setEmail("jordan@qq.com");
User save = userRepository.save();//如果有id表示修改,没有id表示保存
}
//删除
@Test
public void deleteUser(){
userRepository.deleteById("id值");
}