1 mongodb基本操作
选择好安装路径之后一路next,等待安装完成,打开安装目录下的bin文件夹,运行mongo.exe可以运行进入monge的shell命令行界面,如下
monge常用操作指令
-
1 创建数据表库
Use 数据库名称 -
2 检查当前使用的数据库
db -
3 show dbs 展示数据库列表
注意,空的数据库不会显示出来,必须至少插入一个文档。 -
4 删除数据库
先显示可用数据库 show dbs
Use + 数据库名 使用数据库
Db.dropDatabase() 删除数据库 -
5 创建集合 db.createCollection(name,option)
Name 是String类型 这个集合的名称
Option Document类型 Document中可以指定的字段有
capped (Boolean) 是否封闭的集合,如果为true 还需要指定 size 当达到size大小,型数据将会替换最旧的数据
autoIndexId Boolean 类型,如果为true 将在_id上自动创建索引
size 数字 指定集合的大小上限。
Max 数字 指定集合中最大的文档数
注意 插入文档时,会先指定上限集合的capped字段的大小,然后检查max字段
Eg :
db.createCollection(“collection1”)
db.createCollection(“mycollection3”,{capped:true,autoIndexId:true,size:6142800,max:200})
-
6 查看集合 show collections
-
7 删除集合 db.集合名称.drop()
-
8 集合中插入document
db.集合名.insert(
{ _id: 1,
Name:”xxx”,…….
})
注意 如果插入的Doceument中指定了 id字段 将会按照该字段作为id,,如果没有该字段,那么mongodb将自动生成一个Objectid 作为_id .mongo中的 开头的都有特殊含义。
- 9 查询文档 db.collection名称.find() // 查询当前collection的所有文档 ,如果用findOne() 的话只返回一个Document
- 10 条件查询
Db.mycollection.find({_id=2}).pretty()
查询id=2的记录
- 11 AND
- 12 OR
- 13 嵌套查询 一个document里面嵌套别的document
这也是mongodb的与关系型数据库最大的区别之一,若有如下数据
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
查询的条件涉及到里面的document时可以这么写,
查找集合里面的size的h小于15,size的uom=in state=D 。 若是在关系型数据库里面就要用到多表查询,monge 在这种关联关系复杂的数据处理上是十分简单的。
Db.集合名称.find( { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" } )
- 14 update 更新
db.集合名称.update(原先数据字段,新的数据字段)mongodb默认只会修改一个地方,,要全部修改需要设置mult为true
db.mycollection.update({name:”xixixi”},{$set:{name:”xixixiupdate”}})
db.mycollection.update({name:”xixixi”},{$set:{name:”xixixiupdate”}},{mult:true})
-
15 remove 删除
db.集合名称.remove({条件},删除多少条),
如果remove() 不写参数相当于mysql的truncate -
16 skip 跳过 limit 限制
limit用来限制查询的条数,skip用来设置跳过的条数。 -
17 sort排序
db.mycollection.find().sort({字段名:?})
? 设置为1 升序 设置为-1是降序。 -
18 索引
db.集合名.ensuleIndex({字段名:1,字段名:-1})
索引 设置为1 则默认升序,设置为-1 默认降序
两个概念
- 分片: 相当于将数据存储在多个服务器上,追求的是高性能,
- 副本集 : 将数据在别的服务器上备份,当出现单点故障的时候可以自动切换到别的服务器,追求的是高度可靠,稳定。
2 Springboot整合mongodb
1 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
2 配置文件
spring:
data:
mongodb:
uri: mongodb://localhost:27017
database: db1
3 新建实体类
注意
-
@Document注解指明的是,对应数据库中的collection名称。
-
如果不写该注解 默认当前类名首字母小写的相同名字的collection,还是加上好一些一目了然。
-
如果想用实体类中的字段做主键,在字段名称上添加@Id注解即可。
-
如果实体类中的字段名字为id,无论加不加@Id注解,都会默认id为主键
@Document(collection = "collection1")
public class MongoDbTest{
// @Id
private String testId;
private String name;
private String info;
public String getTestId() {
return testId;
}
public void setTestId(String testId) {
this.testId = testId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
4 DAO层
@Component
public class MongoDbTestDAO {
@Autowired
MongoTemplate mongoTemplate;
public MongoDbTest findByName(String name) {
Query query = new Query(Criteria.where("name").is(name));
return mongoTemplate.findOne(query, MongoDbTest.class);
}
public void insert(MongoDbTest test) {
mongoTemplate.save(test);
}
// update 需要三个东西 query update <T> class
public void updateByname(MongoDbTest test) {
Query query = new Query(Criteria.where("name").is(test.getName()));
Update update = new Update().set("info", test.getInfo());
mongoTemplate.updateFirst(query, update, MongoDbTest.class);
}
public void delete(String name) {
Query query = new Query(Criteria.where("name").is(name));
mongoTemplate.remove(query);
}
}
然后Service层就调用这几个就可以了,,当然在controller也可以调用。。controller 和Service和 普通的Mysql的调用方式没有区别就不赘述了。
总结
mongodb的数据库里面存储的都是文本类型的数据是BSON格式(二进制存储),和JSON格式数据相似,如下图
- 增删改查,在MongoTemplate中都有相应的模板,根据模板来使用即可。