MongoDB
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。它将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
关系型与非关系型数据库的区别
- 关系型数据库(SQL)
- 关系型数据库有 mysql /oracle/sql server/sqlite 等
- 关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织。
优点: - 易于维护:都是使用表结构,格式一致;
- 使用方便:SQL 语言通用,可用于复杂查询;
- 复杂操作:支持 SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点: - 读写性能比较差,尤其是海量数据的高效率读写;
- 固定的表结构,灵活度稍欠;
- 高并发读写需求,传统关系型数据库来说,硬盘 I/O 是一个很大的瓶颈。
- 非关系型数据库(NOSQL)
- 非关系型数据库有 redis / hbase /mongoDB /CouchDB /Neo4J 等
- 非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等
优点:
- 格式灵活:存储数据的格式可以是 key,value 形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
- 速度快:nosql 可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
- 高扩展性;
- 成本低:nosql 数据库部署简单,基本都是开源软件。
缺点:
- 不提供 sql 支持
- 无事务处理
- 数据结构相对复杂,复杂查询方面稍欠。
安装与使用
MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从 MongoDB 官网下载安装,MongoDB 预编译二进制包下载地址:https://www.mongodb.com/download-center/community
创建数据目录
MongoDB 将数据目录存储在 db 目录下。但是这个数据目录不会主动创建,我们在安装完成后需要创建它。
cd D:\
md "\data\db"
你也可以通过 window 的资源管理器中创建这些目录,而不一定通过命令行。
运行 MongoDB 服务器
为了从命令提示符下运行 MongoDB 服务器,你必须从 MongoDB 目录的 bin 目录中执行 mongod.exe 文件。
在 bin 目录下打开 cmd 输入该命令
.\mongod.exe --dbpath D:\data\db
连接 MongoDB
我们可以在命令窗口中运行 mongo.exe 命令即可连接上 MongoDB,执行如下命令:
在 MongoDB bin 目录下打开 cmd 输入该命令
./mongo.exe
在命令行中操作数据库
- 查看命令提示
help
db.help()
- 查看所有数据库
show dbs
- 创建数据库
use DATABASE_NAME
如果数据库不存在,则创建数据库,否则切换到指定数据库。
注意
: 在 MongoDB 中,数据库只有在内容插入后才会创建
- 显示当前数据库状态
db.status()
- 查看当前数据库连接机器地址
db.getMongo()
- 删除数据库
db.dropDatabase()
- 查看所有已存在的集合
show collections
- 创建集合
db.createCollection(name, options)
name: 要创建的集合名称
options: 可选参数, 指定有关内存大小及索引的选项
options 可以是如下参数:
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 |
autoIndexId | 布尔 | 3.2 之后不再支持该参数。(可选)如为 true,自动在_id 字段创建索引。默认为 false。 |
size | 数值 | (可选)为固定集合指定一个最大值,即字节数。 |
如果 capped 为 true,也需要指定该字段。 | ||
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
- 删除集合
db.collection.drop()//collection 为集合名
如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。
- 插入文档
MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:
db.COLLECTION_NAME.insert(document)
或
db.COLLECTION_NAME.save(document)
save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 来代替。
insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据
- 更新文档
update() 方法
update() 方法用于更新已存在的文档。语法格式如下:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
参数说明:
query : update 的查询条件,类似 sql update 查询内 where 后面的。
update : update 的对象和一些更新的操作符(如inc…)等,也可以理解为 sql update 查询内 set 后面的
upsert : 可选,这个参数的意思是,如果不存在 update 的记录,是否插入 objNew,true 为插入,默认是 false,不插入。
multi : 可选,mongodb 默认是 false,只更新找到的第一条记录,如果这个参数为 true,就把按条件查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。
示例:
db.user.update({age:25},{$set:{name:'changeName'}},false,true)
相当于: update users set name = ‘changeName’ where age = 25
db.user.update({name:'changeName'},{$inc:{age:50}},false,true)
相当于: update users set age = age+50 where name = ‘changeName’
- 查询
MongoDB 查询数据的语法格式如下
db.collection.find(query, projection)
query :可选,使用查询操作符指定查询条件
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
db.col.find().pretty()
pretty() 方法以格式化的方式来显示所有文档。
- 与 SQL 比较
操作 | 格式 | 范例 | SQL 中的类似语句 |
---|---|---|---|
等于 | { |
db.col.find({“by”:“name”}).pretty() | where by = ‘name’ |
小于 | { |
db.col.find({“likes”:{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | { |
db.col.find({“likes”:{$lte:50}}).pretty() | where likes <= 50 |
大于 | { |
db.col.find({“likes”:{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | { |
db.col.find({“likes”:{$gte:50}}).pretty() | where likes >= 50 |
不等于 | { |
db.col.find({“likes”:{$ne:50}}).pretty() | where likes != 50 |
- MongoDB AND 条件
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
语法格式如下:
db.col.find({key1:value1, key2:value2}).pretty()
- MongoDB OR 条件
MongoDB OR 条件语句使用了关键字 $or,语法格式如下:
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
可视化工具操作数据库
MongoDB Compass 是 MongoDB 官网提供的一个集创建数据库、管理集合和文档、运行临时查询、评估和优化查询、性能图表、构建地理查询等功能为一体的 MongoDB 可视化管理工具。
MongoDB Compass 下载官方地址:https://www.mongodb.com/download-center/compass
nodejs 连接操作数据库
Mongoose 是一个让我们可以通过 Node 来操作 MongoDB 数据库的一个模块
官网 http://mongoosejs.net/
- 安装
npm i mongoose
连接数据库
const mongoose = require("mongoose");
mongoose.connect("mongodb://127.0.0.1:27017/db_name");
创建模型
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const UserType = {
username: String,
password: String,
gender: Number,
introduction: String,
avatar: String,
role: Number,
};
const UserModel = mongoose.model("user", new Schema(UserType));
module.exports = UserModel;
增加数据
UserModel.create({
introduction,
username,
gender,
avatar,
password,
role,
});
查询数据
UserModel.find({ username: "kerwin" }, [
"username",
"role",
"introduction",
"password",
])
.sort({ createTime: -1 })
.skip(10)
.limit(10);
更新数据
UserModel.updateOne(
{
_id,
},
{
introduction,
username,
gender,
avatar,
}
);
删除数据
UserModel.deleteOne({ _id });
Q.E.D.