MongoDB入门教程

^_^打赏
教程分类: java_distribut
阅读:

MongoDB简介

介绍

1546407114827

​ 官方网站 : https://www.mongodb.com/

​ MongoDB 是 Nosql 系列数据库 ( 非关系型数据库 ) , 由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

​ 关系型数据库中的表都是存储一些结构化的数据,每条记录的字段的组成都一样,即使不是每条记录都需要所有的字段,但数据库会为每条数据分配所有的字段。而非关系型数据库以键值对(key-value)存储,它的结构不固定,每一条记录可以有不一样的键,每条记录可以根据需要增加一些自己的键值对,这样就不会局限于固定的结构,可以减少一些时间和空间的开销。

​ 流行的NOSQL数据库 : MongoDB , Redis , memcache

特点

​ ①. 面向集合存储,易于存储对象类型的数据

​ ②. 模式自由

​ ③. 支持动态查询

​ ④. 支持完全索引,包含内部对象

​ ⑤. 支持复制和故障恢复

​ ⑥. 使用高效的二进制数据存储,包括大型对象(如视频等)

​ ⑦. 自动处理碎片,以支持云计算层次的扩展性

​ ⑧. 支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及 C++语言的驱动程序

​ ⑨. 文件存储格式为 BSON(一种 JSON 的扩展)

概念

SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins
primary key primary key 主键, MongoDB自动在每个集合中添加_id的主键

MongoDB安装

windows平台

安装环境 : Windows

安装版本 : 4.0.5

安装步骤 :

​ 双击 , 下一步 , 一直下一步就可以了;

安装 MongoDB服务

mongod.exe --config "c:/develop/MongoDB/bin/mongod.cfg" --install

启动MongoDB服务

net start MongoDB

关闭MongoDB服务

net stop MongoDB

配置环境变量

​ MONGO_HOME=c:/develop/MongoDB

​ 配置PATH

连接MongoDB

​ mongo.exe

移除MongoDB服务

"C:\develop\mongoDB\bin\mongod.exe" --remove

Linux平台

安装环境 : Linux

安装版本 : 4.0.5

安装步骤 :

​ ①. 创建目录用于安装MongoDB : mkdir -p /usr/localhost/mongoDB

​ ②. 切换到mongoDB目录下 : cd /usr/localhost/mongoDB

​ ③. 下载MongoDB安装包 : wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.9.tgz

​ ④. 解压 : tar -zxvf mongodb-linux-x86_64-3.6.9.tgz

​ ⑤. 重命名解压后的目录 : mv mongodb-linux-x86_64-3.6.9 mongodb

​ ⑥. 进入mongodb 目录 : cd mongodb

​ ⑦. 创建两个目录, 分别用来存放数据文件和日志文件 : mkdir data logs

​ ⑧. 在bin目录下配置MongoDB的配置文件 mongod.conf

#数据文件存放目录
dbpath=/usr/local/mongoDB/mongodb/data

#日志文件存放目录
logpath =/usr/local/mongoDB/mongodb/logs/mongodb.log

#端口
port=27017

#以守护线程的方式启用,即在后台运行
fork=true

#日志输出方式,使用追加的方式写日志
logappend=true

#PID File 的完整路径,如果没有设置,则没有PID文件
pidfilepath=/usr/local/mongoDB/mongodb/mongo.pid

#关闭http接口,默认关闭27018端口访问
#nohttpinterface=true

#开启认证
#auth = true

bind_ip=0.0.0.0

启动 :

cd bin
mongod -f mongod.conf

MongoDB数据库操作

连接数据库 :

mongo localhost:27017

查看所有数据库 :

show dbs;

查看当前数据库:

db;

创建数据库 :

use DATABASE_NAME

​ 如果数据库不存在,则创建数据库,否则切换到指定数据库。

删除数据库 :

use pbteach01;
db.dropDatabase();

MongoDB集合操作

创建集合

db.createCollection(name, options) 

​ 参数说明 :

​ name: 新创建的集合名称

​ options: 可选参数, 指定有关内存大小及索引的选项

1546407114847

查询集合

show collections;

删除集合

db.collectionname.drop() ;

​ 案例 :

​ db.pbteach01.drop() ; 删除pbteach01集合

MongoDB文档操作

插入文档

db.COLLECTION_NAME.insert(document) ;

​ 案例:

​ db.user.insert({“name”:“攀博网”,“age”:10,“address”:“北京”});

更新文档

语法格式

db.collection.update(
   		<query>,
   		<update>,
   		<options>
)

​ query : 查询条件,相当于sql语句的where

​ update:更新文档内容

​ options:选项 , 可选

​ upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。

​ multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。

​ writeConcern :可选,抛出异常的级别

替换文档

db.student.update({"name":"攀博网"},{"name":"自学编程攀博网","age":10}) ;

将符合条件 “name”:“攀博网”的第一个文档替换为{“name”:“自学编程攀博网”,“age”:10} ;

$set修改器

使用$set修改器指定要更新的key,key不存在则创建,存在则更新。

案例 :

​ 将符合条件 “name”:“攀博网”的所有文档更新name和age的值。

db.student.update({"name":"攀博网"},{$set:{"name":"自学编程攀博网","age":10}},{multi:true}) ;

​ multi:false表示更新第一个匹配的文档,true表示更新所有匹配的文档。

查询文档

构造数据

db.user.insert({"name":"java10","age":10,"address":"bj"});
db.user.insert({"name":"java11","age":11,"address":"bj"});
db.user.insert({"name":"java12","age":12,"address":"bj"});
db.user.insert({"name":"java13","age":13,"address":"bj"});

语法格式

db.collection.find(query, projection) ;

​ query:查询条件,可不填

​ projection:投影查询key,可不填

查询全部

db.student.find() ;

条件查询

db.student.find({"name":"攀博网"}) ;

范围查询

​ 如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:

操作 格式 范例 RDBMS中的类似语句
等于 {<key>:<value>} db.col.find({"by":"攀博网"}).pretty() where by = '攀博网'
小于 {<key>:{$lt:<value>}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小于或等于 {<key>:{$lte:<value>}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大于 {<key>:{$gt:<value>}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大于或等于 {<key>:{$gte:<value>}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等于 {<key>:{$ne:<value>}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50

​ 案例 :

1546783636120

模糊查询

​ MongoDB查询条件可以使用正则表达式,从而实现模糊查询的功能。

​ MongoDB使用 $regex 操作符来设置匹配字符串的正则表达式,使用PCRE(Pert Compatible Regular Expression)作为正则表达式语言。

​ 语法 :

		{<field>:{regex:/pattern/,options:’<options>’}}

		{<field>:{regex:’pattern’,options:’<options>’}}

		{<field>:{$regex:/pattern/<options>}}	

​ 案例 :

​ name中包含java关键字的文档 :

db.user.find({name:{$regex:/java/}})

1546784330769

​ 忽略大小写 :

db.user.find({name:{$regex:/java/i}})

1546784380900

​ 以0结尾 :

 db.user.find({name:{$regex:/0$/}})

1546784413682

投影查询

db.student.find({"name":"攀博网"},{name:1,age:1,_id:0}) ;

​ 案例:

1546783733908

1546783769031

排序

​ 在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。

​ 语法 :

db.user.find().sort({age:-1}) 

​ 案例 :

1546785720410

分页

​ 在mongoDB中可以使用limit()方法,配合skip() 方法来实现分页功能 ;

​ limit(5) : 代表每页返回的记录数 .

​ skip(5) : 代表跳过前面的多少条记录 .

​ 语法 :

db.user.find().sort({age:-1}).limit(4).skip(5);

​ 案例 :

1546786100340

聚合统计

​ 语法 :

​ db.user.count();

​ db.user.count({name:“java00”});

​ 案例 :

1546786407220

删除文档

语法格式

	db.student.remove(<query>) ;

	query:删除条件,相当于sql语句中的where	

条件删除

db.student.remove({"name":"攀博网})

删除所有

db.student.remove({}) ;

MongoDB JAVA客户端

环境准备

<dependencies>
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongo-java-driver</artifactId>
        <version>3.4.3</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>

插入文档

/**
 * 插入单个文档
 */
@Test
public void testInsertCollection(){
    MongoClient mongoClient = new MongoClient("127.0.0.1",27017);

    MongoDatabase database = mongoClient.getDatabase("pbteach01");
    database.createCollection("user");

    MongoCollection<Document> userCollection = database.getCollection("user");

    Document doc = new Document();
    doc.put("name", "Rose");
    doc.put("age", 10);
    doc.put("address", "北京");

    userCollection.insertOne(doc);
    mongoClient.close();
}


/**
 * 批量插入文档
 */
@Test
public void testInsertCollections(){
    MongoClient mongoClient = new MongoClient("127.0.0.1",27017);

    MongoDatabase database = mongoClient.getDatabase("pbteach01");
    MongoCollection<Document> userCollection = database.getCollection("user");

    List<Document> docList = new ArrayList<Document>();
    for (int i = 0; i < 10; i++) {
        docList.add(new Document("name","java0"+i).append("age", i+10).append("address", "北京市 第"+i+"区"));
    }
    userCollection.insertMany(docList);
    mongoClient.close();
}

更新文档

/**
 * 根据条件更新文档(替换)
 */
@Test
public void testReplaceCollection(){
    MongoClient mongoClient = new MongoClient("127.0.0.1",27017);

    MongoDatabase database = mongoClient.getDatabase("pbteach01");
    MongoCollection<Document> userCollection = database.getCollection("user");

    Document query = new Document("name","Rose");
    Document update = new Document("name","Jerry");

    userCollection.replaceOne(query,update);
    mongoClient.close();
}


/**
 * 更新文档
 */
@Test
public void testUpdateCollection(){
    MongoClient mongoClient = new MongoClient("127.0.0.1",27017);

    MongoDatabase database = mongoClient.getDatabase("pbteach01");
    MongoCollection<Document> userCollection = database.getCollection("user");

    Document query = new Document("name","Rose");

    Document update = new Document("name","Tomcat");
    Document modifier = new Document("$set",update);

    userCollection.updateOne(query,modifier);
    mongoClient.close();
}

查询文档

 /**
     * 查询文档 ---> 查询全部
     */
    @Test
    public void testQueryDocument(){
        MongoClient mongoClient = new MongoClient("127.0.0.1",27017);

        MongoDatabase database = mongoClient.getDatabase("pbteach01");

        MongoCollection<Document> userCollection = database.getCollection("user");

        //获取所有结果
        FindIterable<Document> documents = userCollection.find();

        //获取第一个文档
        Document document = documents.first();
        System.out.println(document);
        System.out.println();


        //获取所有文档
        for (Document doc : documents) {
            System.out.println(doc);
        }
    }



    /**
     * 查询文档 ---> 条件查询
     */
    @Test
    public void testQueryDocumentByCondition(){

        MongoClient mongoClient = new MongoClient("127.0.0.1",27017);
        MongoDatabase database = mongoClient.getDatabase("pbteach01");
        MongoCollection<Document> userCollection = database.getCollection("user");

        FindIterable<Document> documents = userCollection.find(new Document("name", "java01"));

        //获取所有文档
        for (Document doc : documents) {
            System.out.println(doc);
        }
    }




    /**
     * 查询文档 ---> 模糊查询
     */
    @Test
    public void testQueryDocumentByLike(){

        MongoClient mongoClient = new MongoClient("127.0.0.1",27017);
        MongoDatabase database = mongoClient.getDatabase("pbteach01");
        MongoCollection<Document> userCollection = database.getCollection("user");

//        Pattern pattern = Pattern.compile("java");  //包含java
//        Pattern pattern = Pattern.compile("0$");    //以0结尾
        Pattern pattern = Pattern.compile("JAVA",Pattern.CASE_INSENSITIVE); //包含JAVA,忽略大小写
        FindIterable<Document> documents = userCollection.find(new Document("name", pattern));

        //获取所有文档
        for (Document doc : documents) {
            System.out.println(doc);
        }
    }


    /**
     * 查询文档 ---> 数字范围查询
     */
    @Test
    public void testQueryNumericRange(){

        MongoClient mongoClient = new MongoClient("127.0.0.1",27017);
        MongoDatabase database = mongoClient.getDatabase("pbteach01");
        MongoCollection<Document> userCollection = database.getCollection("user");

        FindIterable<Document> documents = userCollection.find(new Document("age", new Document("$gte",18)));

        //获取所有文档
        for (Document doc : documents) {
            System.out.println(doc);
        }
    }


    /**
     * 分页查询
     */
    @Test
    public void testQueryByPage(){

        MongoClient mongoClient = new MongoClient("127.0.0.1",27017);
        MongoDatabase database = mongoClient.getDatabase("pbteach01");
        MongoCollection<Document> userCollection = database.getCollection("user");

        //在查询时, 指定分页参数
        FindIterable<Document> documents = userCollection.find().limit(5).skip(5);

        for (Document doc : documents) {
            System.out.println(doc);
        }
    }

删除文档

/**
 * 删除文档
 */
@Test
public void testDeleteDocument(){

    MongoClient mongoClient = new MongoClient("127.0.0.1",27017);

    MongoDatabase database = mongoClient.getDatabase("pbteach01");
    MongoCollection<Document> userCollection = database.getCollection("user");

    //根据ID删除
    //userCollection.deleteOne(new Document("_id", new ObjectId("5c31ff53eabd231ba4bc3624")));

    //删除符合条件的一条记录
    //userCollection.deleteOne(new Document("name", "java01") );

    //删除符合条件的多条记录
    //userCollection.deleteMany(new Document("name", "java02"));

    //删除全部文档
    userCollection.deleteMany(new Document());

}

MongoDB管理

用户管理

创建用户

语法 :

mongo>db.createUser(
{ user: "<name>",
  pwd: "<cleartext password>",
  customData: { <any information> },
  roles: [
    { role: "<role>", db: "<database>" } | "<role>",
    ...
  ]}
)

案例 :

use admin
db.createUser(
     {
       user:"root",
       pwd:"1234",
       roles:[{role:"root",db:"admin"}]
     }
  )

角色说明 :

  1. 数据库用户角色:read、readWrite;
  2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
  3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
  4. 备份恢复角色:backup、restore;
  5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  6. 超级用户角色:root

查询用户

查询当前库下的所有用户:

show users;

修改用户

语法格式 :

db.updateUser(
  "<username>",
  {
    customData : { <any information> },
    roles : [
              { role: "<role>", db: "<database>" } | "<role>",
              ...
            ],
    pwd: "<cleartext password>"
    },
    writeConcern: { <write concern> }
)

案例 :

修改root用户的角色为readWriteAnyDatabase

use admin
db.updateUser("root",{roles:[{role:"readWriteAnyDatabase",db:"admin"}]})

修改密码

语法格式 :

db.changeUserPassword("username","newPasswd")

案例 :

修改root用户的密码为123

use admin
db.changeUserPassword("root","123")

删除用户

语法格式:

db.dropUser("用户名")

认证登录

1). 在 bin/mongod.cfg 中设置参数 security , 添加 :

security:
  authorization: enabled

2). 重启MongoDB

3). 使用账号密码连接MongoDB数据库

​ mongo.exe -u root -p root –authenticationDatabase admin

4). java程序连接

 MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://root:root@localhost:27017"));