MongoDB

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。它将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

关系型与非关系型数据库的区别

  1. 关系型数据库(SQL)
  • 关系型数据库有 mysql /oracle/sql server/sqlite 等
  • 关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织。
    优点:
  • 易于维护:都是使用表结构,格式一致;
  • 使用方便:SQL 语言通用,可用于复杂查询;
  • 复杂操作:支持 SQL,可用于一个表以及多个表之间非常复杂的查询。
    缺点:
  • 读写性能比较差,尤其是海量数据的高效率读写;
  • 固定的表结构,灵活度稍欠;
  • 高并发读写需求,传统关系型数据库来说,硬盘 I/O 是一个很大的瓶颈。
  1. 非关系型数据库(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’
小于 {:{$lt:}} db.col.find({“likes”:{$lt:50}}).pretty() where likes < 50
小于或等于 {:{$lte:}} db.col.find({“likes”:{$lte:50}}).pretty() where likes <= 50
大于 {:{$gt:}} db.col.find({“likes”:{$gt:50}}).pretty() where likes > 50
大于或等于 {:{$gte:}} db.col.find({“likes”:{$gte:50}}).pretty() where likes >= 50
不等于 {:{$ne:}} 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.


永远自由,永远热爱