​ MongoDB是一个跨平台、面向文档的数据库,是当前NoSQL中最热门的一种。它介于关系型和非关系型数据库之间,是非关系型数据库中:功能最丰富、最像关系型数据库的产品。它支持的数据结构非常松散,是类似Json的Bson格式,因此可以存储较为复杂的数据。

MongoDB初识

1. 简介

​ MongoDB是一个跨平台、面向文档的数据库,是当前NoSQL中最热门的一种。它介于关系型和非关系型数据库之间,是非关系型数据库中:功能最丰富、最像关系型数据库的产品。它支持的数据结构非常松散,是类似Json的Bson格式,因此可以存储较为复杂的数据。

​ MongoDB官网: https://www.mongodb.com/

1. 特点

​ MongoDB最大特点是:支持的查询语言非常强大,语法类似面向对象的查询语句,几乎可以实现所有关系型数据库单表查询的绝大部分功能,而且还支持对数据库建立索引。MongoDB是面向集合的,模式自由的文档型数据库。

1)面向集合存储,易于存储对象型数据

2)模式自由

3)支持动态查询

4)支持完全索引,包含内部对象

5)支持复制和故障恢复

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

7)支持Python、PHP、Java、Ruby、C、C#、JS等语言的驱动程序。

8)文件存储格式为BSON(JSON的扩展)

2. 体系结构

​ MongoDB的逻辑结构是一种层次结构,由Document、Collection、Database三部分组成,逻辑结构是面向用户的。

1)Document:相当关系型数据库表的一行记录

2)Collection:相当于关系型数据库的一张,可以存储多个Document。

3)Database:相当于关系型数据库的一个数据库,可以存储多个Collection。

3. 数据类型

数据类型 特点 示例
null 空值、或不存在的值 {“x”:nul}
布尔型 true、false {“x”:true}
数值 默认使用64浮点型,NumberInt可以定义使用整型 {“x”:NumberInt(1)}
字符串 UTF-8 {“x”:”呵呵”}
日期 毫秒数,不存储时区 {“x”:new Date()}
正则表达式 查询时,可以作为条件 {“x”:/[abc]/}
数组 类别Java {“x”:[“a”,”b”]}
内嵌对象 文档内可以嵌套其他文档对象 {“x”:{“y”:3}}
对象id 12字节字符串,文档的唯一标识 {“x”:objectId()}
二进制数据 非UTF-8数据
代码 查询和文档中可以包含任何JS代码 {“x”:function(){…}}

2. MongoDB简单使用

1. 安装【Windows】

​ 1)下载安装文件

​ 2)安装在指定目录

​ 3)将该目录添加到环境变量中

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/

2. 启动

1)新建cmd窗口

2)使用mongod设置数据库存放目录

1
2
3
4
# 创建目录
md D:\mongodata
# 指定目录
mongod --dbpath=D:\mongodata

2)输入mongo,进入mongoDB中

3)输入exit,退出

3. Docker下安装MongoDB

  1. 拉取镜像

    1
    2
    3
    4
    # 搜索镜像
    docker search mongo
    # 拉取镜像
    docker pull mongo
  2. 创建容器

    1
    2
    # 守护式方式创建容器
    docker run -di --name=my_mongodb -p 27017:27017 mongo
  3. 远程登录

    ​ 我们之前安装的MongoDB既是服务器端,也是客户端,因此我们使用windows下的远程连接部署在docker上的。

    1
    mongo [docker宿主机IP地址]

4. 常用命令

​ 在使用客户端连上了docker的mongoDB之后,我们使用起来学习常用命令。

  1. 选择和创建数据库

    1
    use [数据库名称]

    与MySQL不同,MongoDB下,当指定的数据库名称不存在,则会自动创建一个数据库。

  2. 插入与查询文档

    1
    2
    3
    4
    # 插入文档
    db.[集合名称].insert(数据);
    # 查询所有文档
    db.[集合名称].find();
  3. 演示

    1
    2
    3
    4
    5
    6
    7
    8
    # 创建msgdb数据库
    use msgdb

    # 插入文档信息 包含:context,name
    db.msg.insert({content:"你好啊,MongoDB!",name:"tobing")});

    # 查询所有,查看是否插入成功
    db.msg.find();

    查询结果

    1
    { "_id" : ObjectId("5f1289f78d22f2d94c6e42de"), "content" : "你好啊,MongoDB,这是一句话", "username" : "tobing" }

    观察查询结果我们发现,文档中多了一条**”_id”的字段,这相当于关系型数据库中的主键**。

    当插入文档时没有注定,MongoDB会帮我们自动创建,类型为ObjectID类型。

    我们插入时也可以指定,可以是ObjectID类型或者MongoDB支持的任意类型。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 添加第二条记录
    db.spit.insert({"_id":"1",content:"你好啊,赤橙梦魇过","username":"zenyet"})

    # 再次查询所有
    db.spit.find()

    # 查询一个:查询_id为1的数据
    db.spit.findOne({"_id":"1"})

    # 查询前n条记录
    db.spit.find().limit(3)
    1
    2
    3
    4
    5
    6
    #查询所有
    { "_id" : ObjectId("5f1289f78d22f2d94c6e42de"), "content" : "你好啊,MongoDB,这是一句话", "username" : "tobing" }
    { "_id" : "1", "content" : "你好啊,赤橙梦魇过", "username" : "zenyet" }

    # 查询一个
    { "_id" : "1", "content" : "你好啊,赤橙梦魇过", "username" : "zenyet" }
  4. 修改和删除文档

    修改

    1
    db.集合名称.update(条件,修改的数据)

    删除

    1
    db.集合名称.remove(条件)

    示例

    1
    2
    3
    4
    # 更新_id为1的content
    db.spit.update({"_id":"1"},{$set:{content:"Hello, This is new !"}})
    # 删除_id为1的文档
    db.spit.remove({"_id":"1"})

    注意:当不加上$set的时候,会将符合条件的记录的其他字段全部清空。

  5. 统计条数

    1
    2
    3
    4
    # 统计所有
    dp.spit.count()
    # 统计符合条件
    dp.spit.count(条件)
  6. 模糊查询

    MongoDB的模糊查询通过正则表达式方式实现的。格式为:/模糊查询字符串/

    1
    2
    3
    4
    # 查询所有content字段包含tobing的文档
    db.spit.find({content:/流量/})
    # 查询所有content字段以流量开头的文档
    db.spit.find({content:/^流量/})
  7. 比较运算符

    <、>、<=、>=操作

    1
    2
    3
    4
    5
    db.集合名称.find({"Field":{$gt:value}}) 	// 大于:field > value
    db.集合名称.find({"Field":{$lt:value}}) // 小于:field < value
    db.集合名称.find({"Field":{$gte:value}}) // 大于等于:field >= value
    db.集合名称.find({"Field":{$lte:value}}) // 小于等于:field <= value
    db.集合名称.find({"Field":{$ne:value}}) // 不等于:field != value
  8. 包含与不包含

    1
    2
    3
    4
    # 查询id包含101,102的文档
    db.spit.find({id:{$in:["101","102"]}})
    # 查询不包含的
    db.spit.find({id:{$nin:["101","102"]}})
  9. 条件连接

    需要查询同时满足两个条件的时候,使用and

    需要查询满足其中一个条件的时候,用or

    1
    2
    3
    $and:[{},{},{}]

    $or:[{},{},...]
    1
    2
    3
    4
    # 查询符合id=1且name="tobing"的文档
    db.spit.find({$and:[{"id":1},{"name":"tobing"}]})
    # 查询符合id=1或name="tobing"的文档
    db.spit.find({$or:[{"id":1},{"name":"tobing"}]})
  10. 列值增长

    可以使用$inc运算符对原有的值进行增加或减少

    1
    db.spit.udpate({_id:"2"},{$inc:{visits:NumberInt(1)}})

3. Java操作MongoDB

1. 创建maven、导入依赖坐标

1
2
3
4
5
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.6.3</version>
</dependency>

2. 创建测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package top.tobing.test;

import com.mongodb.BasicDBObject;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

import java.util.HashMap;
import java.util.Map;

/**
* @author Tobing
*/
public class MongoTest {
public static void main(String[] args) {
// 创建连接
MongoClient client = new MongoClient("192.168.8.128");
// 打开数据库
MongoDatabase spitdb = client.getDatabase("spitdb");
// 查询所有
// testFindAll(spitdb);
// 条件查询
// testFindByEx(spitdb);
// 插入数据
testInsertData(spitdb);
testFindAll(spitdb);

// 关闭连接
client.close();
}

private static void testInsertData(MongoDatabase spitdb) {
MongoCollection<Document> spit = spitdb.getCollection("spit");

Map<String, Object> map = new HashMap<String, Object>();
map.put("username","张三丰");
map.put("content","我是太极创始人,有我拽?");
Document document = new Document(map);
spit.insertOne(document);
}

/**
* 条件查询
*
* @param spitdb
*/
private static void testFindByEx(MongoDatabase spitdb) {
MongoCollection<Document> spit = spitdb.getCollection("spit");
// 构造查询条件
BasicDBObject bson = new BasicDBObject("username", "tobing");
FindIterable<Document> documents = spit.find(bson);
for (Document document : documents) {
System.out.println(
document.get("username") + ":" + document.get("content"));
}
}

/**
* 查询所有
*
* @param spitdb
*/
public static void testFindAll(MongoDatabase spitdb) {
MongoCollection<Document> spit = spitdb.getCollection("spit");
FindIterable<Document> documents = spit.find();
for (Document document : documents) {
System.out.println(
document.get("username") + ":" + document.get("content"));
}
}
}

评论