文章目录
MongoDB概念解析
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系型数据库的。
关系型数据库与非关系型数据库的区别
关系型数据库
- 数据存储方式不同。关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。
非关系型数据库
- 数据存储方式不同。非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。
MongoDB相比于关系型数据具备的优点
- 高可扩展性
- 分布式存储
- 低成本
- 结构灵活
命令行操作MongoDB
数据库常用命令
【db】 查看当前所在的数据库 > 当前的数据库的名称
【show dbs】 查看所有的数据库 > 所有的数据库
【use 数据库名称】 切换数据库(如果没有,新创建) > switched to db 数据库名称
【db.dropDatabase( ) 】 删除当前数据库 > { “dropped” : “mydb”, “ok” : 1 }
首先,检查列表数据库通过使用命令 show dbs
如果想删除新数据库 , 那么 dropDatabase() 命令如下:
现在检查的数据库列表 就没有了[db.stats( )] 获取当前数据库的信息,比如Obj总数、数据库总大小、平均Obj大小等:
【db.gps_point.stats( )】 > 获取当前数据库中集合的信息
【 db.serverStatus( ) 】 获取服务器的状态:
【db.version( )】 查看当前数据库版本 > 版本号
【db.getMongo()】 查看当前db的链接机器地址:
【db.help( )】 显示数据库操作命令,里面有很多的命令:
Collection 集合操作(数组)
- 创建一个聚集集合(table) db.createCollection(name, options);
- name: 要创建的集合名称
- options: 可选参数, 指定有关内存大小及索引的选项
字段 | 描述 |
---|---|
capped | 是否启用集合限制,如果开启需要制定一个限制条件,默认为不启用,这个参数没有实际意义 |
size | 限制集合使用空间的大小,默认为没有限制 |
max | 集合中最大条数限制,默认为没有限制 |
autoIndexId | 是否使用_id作为索引,默认为使用(true或false) |
size的优先级比max要搞
- 得到指定名称的集合 db.getCollection(name) 创建集合
`db.createCollection(‘obj’, {
autoIndexId: false
})- 查看已有集合: show collections 或 show tables 返回已创建的集合
- 得到当前db的所有聚集集合: db.getCollectionNames() [所有集合名称]
- 删除集合 db.[collection].drop() true or false
Document 文档操作 (对象)
- 【db.[集合名称].insert(变量 or 数据)】 插入数据
- 【 db.[集合名称].find( ) / db.[集合名称].findOne( ) 】 查找所有数据
- 更新文档
- db.collection.update(查询条件,要更新的内容, { multi: true(是否全部更新) })
- db.collection.save(文档数据) 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入
- 删除文档 db.collection.remove(query, justOne, writeConcern) 如果参数传递一个空对象则全部删除
query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
writeConcern :(可选)抛出异常的级别。
- 简单查询文档
- findOne(): 它只返回一个文档。
- and 多个条件查询 db.col.find({key1:value1, key2:value2}).pretty()
- or 或者条件查询 db.col.find({$or:[{“by”:“条件1”},{“title”: “条件2”}]}).pretty()
集合查询
- 条件操作符
操作 | 格式 | 范例 |
---|---|---|
等于 | { key:value} | db.col.find({“by”:“内容”}) |
小于 | { key:{$lt:value}} | db.col.find({“likes”:{$lt:50}}).pretty() |
小于或等于 | { key:{$lte:value}} | db.col.find({“likes”:{$lte:50}}).pretty() |
大于 | { key:{$gt:value}} | db.col.find({“likes”:{$gt:50}}).pretty() |
大于或等于 | { key:{$gte:value}} | db.col.find({“likes”:{$gte:50}}).pretty() |
不等于 | { key:{$ne:value}} | db.col.find({“likes”:{$ne:50}}).pretty() |
模糊查询
- 查询 title 包含"教"字的文档: db.col.find({title:/教/})
- 查询 title 字段以"教"字开头的文档:db.col.find({title:/^教/})
- 查询 titl e字段以"教"字结尾的文档:db.col.find({title:/教$/})
- 读取指定数量的数据记录 — Limit
db.COLLECTION_NAME.find().limit(num)
- 跳过指定数量的数据 — skip
db.COLLECTION_NAME.find().limit(num).skip(num)
- 排序
使用 sort() 方法对数据进行排序
db.COLLECTION_NAME.find().sort({KEY:1}) — 1为升序,-1为降序
MongoDB可视化工具 (Robo3T) 或 adminMongo
MongoDB可视化工具 MongoDBCompass
一、官网地址
解压文件夹找到文件打开
一直 next 到最后
一直点 即可。
Studio 3T的使用
一、官网地址
二、下载和安装
点击DOWNLOAD即可下载
按照自己电脑系统进行选择,然后填写邮箱和选择行业,第一次登录如果不提交不会下载,下载完成是一个zip压缩包(我的电脑是windows系统),解压缩安装即可,安装途中可以自行选择安装路径
安装完成选择连接:
根据提示进行操作,最后点击保存即可:
右键新建的连接,选择Add Database新建数据库:
输入数据库名称点击OK:
右键创建的database,选择Add Collection创建新的Collection(相当于新建关系型数据库中的表),也可以删除数据库Drop Database:
三、CRUD操作
首先打开命令行窗口,Open intelliShell:
红色框是输入的命令行,绿色框是输出的提示信息:
1、Insert操作详解
插入一个文档,db.collection.insertOne():
插入多个文档,db.collection.insertMany():
2、Query操作详解
查询所有, db.collection.find(),相当于:SELECT * FROM table_name
数据源
db.inventory.insertMany([
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);
按条件查询db.collection.find({ke:value}),相当于SELECT * FROM table_name WHERE name = ?
使用查询运算符指定条件
指定AND条件查询,相当于SELECT * FROM inventory WHERE status = “A” AND qty < 30
指定OR条件,相当于SELECT * FROM inventory WHERE status = “A” OR qty < 30
指定AND和OR条件,相当于SELECT * FROM inventory WHERE status = “A” AND ( qty < 30 OR item LIKE “p%” )
3、Update操作详解
数据源
db.inventory.insertMany( [
{ item: "canvas", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "mat", qty: 85, size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" },
{ item: "mousepad", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
{ item: "sketchbook", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "sketch pad", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" }
] );
更新单个文档db.collection.updateOne()
更新多个文档db.collection.updateMany()
替换文档db.collection.replaceOne()。
4、Delete操作详解
数据源
db.inventory.insertMany( [
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
] );
删除所有文档db.collection.deleteMany()
删除与条件匹配的文档
删除与条件匹配的一个文档
以上基本操作及其他扩展的法见:官网
在Express中利用Mongoose操作MongoDB
Mongoose 是一个让我们可以通过Node来操作MongoDB数据库的一个模块
- Schema(模式对象)
——Schema 对象定义约束了数据库中的文档结构
- Model
——Model 对象作为集合中的所有文档的表示,相当于MongoDB中的collection,它的每一个实例就是一个document文档
- Document
——Document表示集合中的具体文档,相当于collection中的一个具体文档
关系:Schema生成Model,Model创造Document
- Mongoose的使用方式
- 下载安装Mongoose(npm i mongoose --save)
- 项目中引入mongoose(const mongoose = require(‘mongoose’))
- 连接MongoDB数据库(mongoose.connect(‘mongodb://数据库ip地址 : 端口号( 默认端口27017可以省略 )/数据库名’))
- 数据库连接成功事件(mongoose.connection.once(‘open’ , () => {}))
- 数据库断开事件(mongoose.connection.once(‘close’ , () => {}))
- 创建Schema对象(约束数据)
- const Schema = mongoose.Schema
var stuSchema = new Schema({ name: String, gender: { type: String, default: 'male' } }, { timestamps: true (自动添加createdAt和updatedAt)
})
- 将stuSchema映射到一个MongoDB collection并定义这个文档的构成(var stuModle = mongoose.model(‘User’, stuSchema, ‘user’)) 这里注意点三个参数,如果不加会自动把collection定义成复数形式
- 增删改查操作
- 查找数据 (stuModle.find({条件}), fn)
- 增加数据 ( new UserModel({}).save())
- 删除数据 (UserModel.deleteOne({条件}, fn)) remove
- 修改数据 (UserModel.updateOne({条件}, fn))
模式(Schemas)
支持的字段类型
类型 | 作用 |
---|---|
String | 定义字符串 |
Number | 定义数字 |
Date | 定义日期 |
Buffer | 定义二进制 |
Boolean | 定义布尔值 |
Mixed | 定义混合类型 |
ObjectId | 定义对象ID |
Array | 定义数组 |
启动Node.js管理系统项目
- 建立github仓库
- 利用Express分别构建WebServer与APIServer