下载与安装
mongo偶数版为稳定版,奇数版为开发版,我们使用下载偶数版(比如:3.2, 3.4等)
windows64位版
linux版
windows安装
- 傻瓜式安装,记住选择customer(不要使用默认安装位置,修改为安装到D盘)
- 配置环境变量,将mongodb的bin目录添加到环境变量中
- 打开cmd输入mongod回车即可验证是否安装成功,关闭cmd
- 为mongodb创建保存数据的文件夹, mongodb的数据和日志都会保存到这个文件夹下
(可以在任意位置创建,这里为了方便查找,我在mongodb的bin目录创建和bin目录同级的目录data,在data文件夹中再分别创建一个db和log的文件夹,分别用来存储数据库的数据和日志信息) - 打开cmd输入如下命令回车启动mongodb服务器,出现如下信息表示mongodb服务启动成功(从日志中可以看出,mongodb默认端口是27017)
mongod --dbpath D:\software\MongoDB\data\db使用默认端口27017(推荐) mongod --dbpath D:\software\MongoDB\data\db --port 10086也可以指定端口(不推荐)
- 将mongodb设置为windows系统服务,并且开机自启
- 在mongodb的bin目录创建和bin目录同级的一个配置文件mongod.cfg
- 在mongod.cfg文件中指定mongodb的日志文件和存储数据的db目录,保存后退出
systemLog: destination: file path: D:\software\MongoDB\data\log\mongod.log storage: dbPath: D:\software\MongoDB\data\db
- 以管理员身份打开cmd执行以下命令将MongoDB添加到windows服务中
sc.exe create MongoDB binPath= "\"D:\software\MongoDB\bin\mongod.exe\" --service --config=\"D:\software\MongoDB\mongod.cfg\"" DisplayName= "MongoDB" start= "auto"
- 打开任务管理器在服务中启动mongodb服务即可
- 如果启动失败,证明上述的操作有误,需要以管理员身份打开cmd执行以下命令, 删除之前配置的服务,重新执行上述4-10步骤操作
sc delete MongoDB
- 使用Navicat连接MongoDB数据库即可
linux安装
mongodb中的三个概念
数据库database对应关系数据库中数据库的概念
集合collection对应关系数据库中表的概念
文档document对应关系数据库中记录的概念, 文档是数据库中最小的单位,我们操作的内容都是文档
MongoDB命令
操作数据库和集合
选择数据库/创建数据库(不存在则创建数据库)
-- use 数据库名
use test
(注意: mongodb不需要我们手动创建数据库和集合,使用use命令,当数据库不存在时会自动创建)
查询所有数据库
show dbs
show dbs显示所有数据库(如果数据库只是创建了,但还没有在该数据库下创建集合则使用此命令不能查看到, show dbs只能查看创建过集合后的数据库)
删除数据库
db.dropDatabase()
查看当前所在数据库
db
查看当前数据库下有哪些集合
show collections
删除集合
-- db.集合名.drop()
db.user.drop()
(注意: 如果当前数据库下就只有这一个集合,当把这个集合删除之后,该数据库也会被删除,如果当前数据库中还有集合则数据库不会被删除)
操作文档
插入
向指定的集合中插入一个文档
-- db.集合名.insertOne({document对象})
-- *注: 此处的document格式类似json
db.user.insertOne(
{name:”parkour”,age:27}
);
向指定的集合中插入多个文档
/*
db.集合名.insertMany(
[ {document1}, {document2} ]
)
*/
db.user.insertMany(
[ {name:"xqy",age:27}, {name:"psw",age:28} ]
);
查询
查询指定集合下满足查询条件匹配到的第一个文档
/*
db.集合名.findOne(
{查询条件对象}
);
*/
db.user.findOne(
{age:27}
);
/*parkour和xqy用户年龄都是27
会返回第一个满足条件的parkour用户*/
查询指定集合下所有的文档
/*
db.集合名.find({})
*/
db.user.find({});
/*find({})查询所有文档,返回的是一个数组
所以,可以以下标的方式取出其中每一个文档
数组下标从0开始
db.user.find({})[0];
db.user.find()[1];
*/
查询指定集合下满足查询条件匹配到的所有文档
/*
db.集合名.find(
{查询条件对象}
)
*/
//带一个条件
db.user.find(
{name:"parkour"}
);
//带多个条件
db.user.find(
{name:"xqy",age:27}
);
统计指定集合下文档的个数
/*
db.集合名.count();
*/
db.user.count();
统计指定集合下满足查询条件的文档个数
/*
db.集合名.find(
{查询条件对象}
).count();
*/
db.user.find(
{age:27}
).count();
修改
修改指定集合下满足查询条件匹配到的第一个文档
(注意: 使用到$set)
(如果有多个满足条件的文档,只会修改第一个匹配到的文档)
/*
db.集合名.updateOne(
{查询条件对象},
{ $set:{要修改的属性:修改后的值} }
);
*/
db.user.updateOne(
{name:"xqy"},
{ $set:{age:30} }
);
/*查询name为xqy的文档,将其年龄改为30
注意: 此时,如果查询到多个满足条件的文档,只会修改第一个文档*/
修改指定集合下满足查询条件匹配到的所有文档
(注意: 使用到$set)
(如果有多个满足条件的文档,所有满足条件的文档,都会被修改)
/*
db.集合名.updateMany(
{查询条件对象},
{ $set:{要修改的属性:修改后的值} }
);
*/
db.user.updateMany(
{name:"xqy"},
{ $set:{age:30} }
);
/*查询name为xqy的文档,将其年龄改为30
注意: 此时,如果查询到多个满足条件的文档,所有满足条件的文档,都会被修改*/
删除
删除指定集合下某个文档中的某个属性
(注意: 使用到$unset)
/*
db.集合名.update(
{查询条件对象},
{ $unset:{要删除的属性:值任意} }
);
*/
db.user.update(
{name:"xqy"},
{ $unset:{age:1} }
);
/*查询name为xqy的文档,将其年龄属性删除
此处是删除属性的操作,不关心属性的值,所以age:后跟任意值 都行 */
删除指定集合下满足查询条件匹配到的第一个文档
/*
db.集合名.deleteOne(
{查询条件对象}
);
*/
//删除所有文档中的第一个文档
db.user.deleteOne({});
/*删除满足查询条件匹配到的第一个年龄为30的文档*/
db.user.deleteOne(
{age:30}
);
删除指定集合下满足条件的所有文档
/*
db.集合名.deleteMany(
{查询条件对象}
);
*/
db.user.deleteMany({}); //删除所有文档
db.user.deleteMany(
{age:30}
);//删除所有年龄为30的文档
MongoDB的聚合框架
MongoDB的索引
MongoDB的复制集(Replication)
复制集的用途: 为了避免单点故障, 实现高可用
MongoDB分片(Sharding)
SQL语句的转换MongoDB⇋MySQL
MongoDB其他知识点
MongoDB出厂自带数据库
MongoDB会自带一个local的数据库,里面有一个集合starup_log
该集合中记录了mongodb的启动日志
_id | hostname | startTime | startTimeLocal | cmdLine | pid | buildinfo |
---|---|---|---|---|---|---|
DESKTOP-AM2JGOO-1570020426821 | DESKTOP-AM2JGOO | 1570020426000 | Wed Oct 02 20:47:06.821 | { “storage” : { “dbPath” : “D:\software\MongoDB\data\db” } } | 14968 |
在Navicat中使用JSON视图展示MongoDB文档数据
MongoDB中的注释
/*多行注释*/
//单行注释
MongoDB中的主键
当向MongoDB中插入一个文档时,如果我们没有指定主键_id,则MongoDB会自动给我们创建一个_id的主键列,存的值为ObjectId
内嵌文档
MongoDB的文档的属性值也可以是一个文档,当一个文档的属性值是一个文档时,我们称这个文档叫做内嵌文档
向username为sunwukong的文档中,添加一个
{hobby:{cities:["beijing","shanghai","shenzhen"] , movies:["sanguo","hero"]}}
如果要通过内嵌文档来对文档进行查询, 此时属性名必须使用双引号引起来
查询喜欢电影hero的文档
db.use.findOne({"hobby.movies":"hero"});
向内嵌文档的数组中添加一个新的元素,使用$push命令
$push 用于向数组中添加一个新的元素, 不考虑元素是否重复
$addToSet 用于向数组中添加一个新的元素, 元素重复则不会添加
向tangseng中添加一个新的电影Interstellar
使用for循环批量插入大量数据
向numbers中插入20000条数据
var arr = [];
for(var i=1;i<=20000;i++){
arr.push({num:i});
}
db.numbers.insertMany(arr);
操作符
比较操作符
- $eq 等于
- $gt 大于
- $gte 大于等于
- $in 在里面
- $ne 不等于
- $lt 小于
- $lte 小于等于
- $nin 不在里面
//17.向numbers中插入20000条数据
var arr = [];
for(var i=1;i<=20000;i++){
arr.push({num:i});
}
db.numbers.insertMany(arr);
//19.查询numbers中num大于5000的文档
db.numbers.find({num:{$gt:500}});
//20.查询numbers中num小于30的文档
db.numbers.find({num:{$lt:500}});
//21.查询numbers中num大于40小于50的文档
db.numbers.find({num:{$gt:40,$lt:50}});
逻辑操作符
函数
limit(n)
查询前n条数据
//17.向numbers中插入20000条数据
var arr = [];
for(var i=1;i<=20000;i++){
arr.push({num:i});
}
db.numbers.insertMany(arr);
//23.查看numbers集合中的前10条数据
db.numbers.find({}).limit(10);
杂项
14.mongodb中存储的最小单元是文档,所谓的文档就是json结构的数据
15.MongoDB中查询出来的每一个文档都可以看做是一个json对象,可以直接以 对象.属性的方式取出对象的属性值
db.user.find({name:"parkour"}).name;
// 打印结果 parkour
MongoDB练习
练习一
创建一个mongodb数据库, 向数据库的user集合中添加一个文档,{name:”xiaoqinyun”}
use mongod;
db.user.insertOne({name:"xiaoqinyun"});
向数据库的user集合中name为xiaoqinyun的文档, 添加一个属性age,值为27
db.user.updateOne(name:"xiaoqinyun",{$set:{age:27}});
使用{username:”tangseng”} 替换 username 为 zhubajie的文档
删除username为sunwukong的文档的address属性
/参见: 内嵌文档/
向username为sunwukong的文档中,添加一个 {hobby:{cities:[“beijing”,”shanghai”,”shenzhen”] , movies:[“sanguo”,”hero”]}}
向username为tangsen的文档中,添加一个 {hobby:{movies:[“A Chinese Odyssey”,”King of comedy”]}}
/参见: 内嵌文档/
查询喜欢电影hero的文档
/参见: 内嵌文档/
向tangseng中添加一个新的电影Interstellar
删除喜欢beijing的用户
db.use.deleteMany({"hobby.cities":"beijing"});
删除user集合
练习二
向numbers中插入20000条数据
var arr = [];
for(var i=1;i<=20000;i++){
arr.push({num:i});
}
db.numbers.insertMany(arr);
查看numbers集合中的前10条数据
db.numbers.find({}).limit(10);
查看numbers集合中的第11条到20条数据
查看numbers集合中的第21条到30条数据
练习三
将dept和emp集合导入到数据库中
查询工资小于2000的员工
查询工资在1000-2000之间的员工
查询工资小于1000或大于2500的员工
查询财务部的所有员工
查询销售部的所有员工
查询所有mgr为7698的所有员工
为所有薪资低于1000的员工增加工资400元
SpringBoot操作MongoDB实现增删改查
1.pom.xml引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2.创建application.yml
spring:
data:
mongodb:
host: 192.168.72.129
database: studentdb
3.创建实体类
创建包com.changan.mongodb,包下建包pojo 用于存放实体类,创建实体类
package com.changan.mongdb.pojo;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
import lombok.Getter;
import lombok.Setter;
@Document(collection = "student")
@Getter
@Setter
public class Student implements Serializable {
@Id
private Long id;
private String name;
private String sex;
private String age;
private String introduce;
}
4.创建数据访问接口
com.changan.mongodb包下创建dao包,包下创建接口
package com.changan.mongdb.dao;
import com.changan.mongdb.pojo.Student;
import java.util.List;
import java.util.Map;
public interface StudentDao {
void save(Student student);
void update(Student student);
List<Student> findAll();
void delete(Integer id);
}
5.创建业务逻辑类
com.changan.mongodb包下创建impl包,包下创建类
package com.changan.mongdb.dao.impl;
import com.changan.mongdb.dao.StudentDao;
import com.changan.mongdb.pojo.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.LookupOperation;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class StudentDaoImpl implements StudentDao {
@Autowired
private MongoTemplate mongoTemplate;
/**
* 新增信息
* @param student
*/
@Override
public void save(Student student) {
mongoTemplate.save(student);
}
/**
* 修改信息
* @param student
*/
@Override
public void update(Student student) {
//修改的条件
Query query = new Query(Criteria.where("id").is(student.getId()));
//修改的内容
Update update = new Update();
update.set("name",student.getName());
mongoTemplate.updateFirst(query,update,Student.class);
}
/**
* 查询所有信息
* @return
*/
@Override
public List<Student> findAll() {
return mongoTemplate.findAll(Student.class);
}
/**
* 根据id删除信息
* @param id
*/
@Override
public void delete(Integer id) {
Student byId = mongoTemplate.findById(id,Student.class);
mongoTemplate.remove(byId);
}
}
6.创建测试类
package com.changan.mongdb;
import com.changan.mongdb.dao.StudentDao;
import com.changan.mongdb.pojo.Student;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import java.util.Map;
@RunWith(SpringRunner.class)
@SpringBootTest
public class MongdbApplicationTests {
@Autowired
private StudentDao studentDao;
/**
* 查询所有信息
*/
@Test
public void findAll() {
List<Student> all = studentDao.findAll();
System.out.println(all.size());
}
/**
* 新增信息
*/
@Test
public void save() {
Student student = new Student();
student.setId(6l);
student.setName("宋人头");
studentDao.save(student);
}
/**
* 修改信息
*/
@Test
public void update() {
Student student = new Student();
student.setId(2l);
student.setName("吴很帅");
studentDao.update(student);
}
/**
* 删除信息
*/
@Test
public void delete() {
studentDao.delete(3);
}
}