MongoDB
发表于:2021-02-03 | 分类: 数据库

下载与安装

mongo偶数版为稳定版,奇数版为开发版,我们使用下载偶数版(比如:3.2, 3.4等)

windows64位版

linux版

windows安装

  1. 傻瓜式安装,记住选择customer(不要使用默认安装位置,修改为安装到D盘)
  2. 配置环境变量,将mongodb的bin目录添加到环境变量中
  3. 打开cmd输入mongod回车即可验证是否安装成功,关闭cmd
  4. 为mongodb创建保存数据的文件夹, mongodb的数据和日志都会保存到这个文件夹下
    (可以在任意位置创建,这里为了方便查找,我在mongodb的bin目录创建和bin目录同级的目录data,在data文件夹中再分别创建一个db和log的文件夹,分别用来存储数据库的数据和日志信息)
  5. 打开cmd输入如下命令回车启动mongodb服务器,出现如下信息表示mongodb服务启动成功(从日志中可以看出,mongodb默认端口是27017)
    mongod --dbpath D:\software\MongoDB\data\db使用默认端口27017(推荐)
    mongod --dbpath D:\software\MongoDB\data\db --port 10086也可以指定端口(不推荐)
  6. 将mongodb设置为windows系统服务,并且开机自启
  7. 在mongodb的bin目录创建和bin目录同级的一个配置文件mongod.cfg
  8. 在mongod.cfg文件中指定mongodb的日志文件和存储数据的db目录,保存后退出
    systemLog:
        destination: file
        path: D:\software\MongoDB\data\log\mongod.log
    storage:
        dbPath: D:\software\MongoDB\data\db
  9. 以管理员身份打开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"
  10. 打开任务管理器在服务中启动mongodb服务即可
  11. 如果启动失败,证明上述的操作有误,需要以管理员身份打开cmd执行以下命令, 删除之前配置的服务,重新执行上述4-10步骤操作
    sc delete MongoDB
  12. 使用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文档数据

MongoDB1
MongoDB2

MongoDB中的注释

/*多行注释*/ //单行注释

MongoDB中的主键

当向MongoDB中插入一个文档时,如果我们没有指定主键_id,则MongoDB会自动给我们创建一个_id的主键列,存的值为ObjectId

内嵌文档

MongoDB的文档的属性值也可以是一个文档,当一个文档的属性值是一个文档时,我们称这个文档叫做内嵌文档

向username为sunwukong的文档中,添加一个

{hobby:{cities:["beijing","shanghai","shenzhen"] , movies:["sanguo","hero"]}}

MongoDB3

如果要通过内嵌文档来对文档进行查询, 此时属性名必须使用双引号引起来

查询喜欢电影hero的文档

db.use.findOne({"hobby.movies":"hero"});

MongoDB4

向内嵌文档的数组中添加一个新的元素,使用$push命令

$push 用于向数组中添加一个新的元素, 不考虑元素是否重复

$addToSet 用于向数组中添加一个新的元素, 元素重复则不会添加

向tangseng中添加一个新的电影Interstellar

MongoDB5

使用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);
    }
}
上一篇:
NIO
下一篇:
Java对JSON的操作方式