Wang's blog Wang's blog
首页
  • 前端文章

    • HTML教程
    • CSS
    • JavaScript
  • 前端框架

    • Vue
    • React
    • VuePress
    • Electron
  • 后端技术

    • Npm
    • Node
    • TypeScript
  • 编程规范

    • 规范
  • 我的笔记
  • Git
  • GitHub
  • VSCode
  • Mac工具
  • 数据库
  • Google
  • 服务器
  • Python爬虫
  • 前端教程
更多
收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Wang Mings

跟随大神,成为大神!
首页
  • 前端文章

    • HTML教程
    • CSS
    • JavaScript
  • 前端框架

    • Vue
    • React
    • VuePress
    • Electron
  • 后端技术

    • Npm
    • Node
    • TypeScript
  • 编程规范

    • 规范
  • 我的笔记
  • Git
  • GitHub
  • VSCode
  • Mac工具
  • 数据库
  • Google
  • 服务器
  • Python爬虫
  • 前端教程
更多
收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Python爬虫

  • 前端教程

    • 团队规范

    • Project

    • JS

    • NodeJS

      • Koa 洋葱模型原理分析
      • Nginx反向代理
      • Connect源码解析
      • Express源码解析
      • Node模块源码分析
      • MongoDB指南
        • [#](#mongodb-安装) MongoDB 安装
        • [#](#概念解析) 概念解析
        • [#](#command) Command
        • [#](#mongoose) Mongoose \(opens new window\)
          • [#](#schema) Schema
          • [#](#model) Model
        • [#](#附上mysql数据库安装) 附上Mysql数据库安装
        • [#](#参考文章) 参考文章
      • 常用Node API
      • 常用Node工具总结
      • Node Debug for VSCode
      • Redis简介
    • Vue

    • React

    • 效率工具

    • 读书笔记

  • 教程
  • 前端教程
  • NodeJS
wangmings
2022-07-19
目录

MongoDB指南

# # MongoDB指南

MongoDB是目前最流行的NoSQL数据库之一。MongoDB和Node.js特别般配,因为MongoDB是基于文档的非关系型数据库,文档是按BSON(JSON的轻量化二进制格式)存储的,增删改查等管理数据库的命令和JavaScript语法很像。

# # MongoDB 安装

以下是使用macOS安装方法:

来源: https://www.runoob.com/mongodb/mongodb-osx-install.html

  1. 下载
    # 进入 /usr/local
    cd /usr/local
    
    # 下载
    sudo curl -O https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-4.0.9.tgz
    
    # 解压
    sudo tar -zxvf mongodb-osx-ssl-x86_64-4.0.9.tgz
    
    # 重命名为 mongodb 目录
    
    sudo mv mongodb-osx-x86_64-4.0.9/ mongodb
    
1
2
3
4
5
6
7
8
9
10
11
12
13
  1. 开通文件权限
    # 创建日志及数据存放的目录:
    # 数据存放路径:
    sudo mkdir -p /usr/local/var/mongodb
    
    # 日志文件路径:
    sudo mkdir -p /usr/local/var/log/mongodb
    
    # 接下来要确保当前用户对以上两个目录有读写的权限:
    sudo chown springleo /usr/local/var/mongodb # springleo是你本机用户
    sudo chown springleo /usr/local/var/log/mongodb
    
1
2
3
4
5
6
7
8
9
10
11
  1. 启动mongodb服务
    # 安装完成后,我们可以把 MongoDB 的二进制命令文件目录(安装目录/bin)添加到 PATH 路径中:
    export PATH=/usr/local/mongodb/bin:$PATH
    
    # 使用以下命令在后台启动 mongodb:
    sudo mongod --dbpath /usr/local/var/mongodb --logpath /usr/local/var/log/mongodb/mongo.log
    
1
2
3
4
5
6
  1. 开终端玩sql
    cd /usr/local/mongodb/bin
    ./mongo
    
1
2
3

# # 概念解析

在mongodb中基本的概念是数据库、集合、文档。下表将帮助更容易理解Mongodb中的一些概念:

SQL概念 MongoDB概念 解释
database database 数据库。一致
table collection 数据库表
row document 数据库表一行
column field 数据库表一列
primary key primary key 主键。mongodb默认有主键_id
table joins 表连接。mongodb不支持

# # Command

  • 全局

    • mongo 进入db命令
    • show dbs 显示所有可用dbs
    • db 显示当前db
  • 数据库

    • use [dbName] 使用或新建数据库
    • db.dropDatabase() 删除当前数据库
    • show collections 显示当前数据库所有集合(表)
    • db.collections.drop() 删除当前数据库所有集合(表)
  • 增删改查

    • 增
      • db.[collectionName].insert(object) 数据库插入一行数据
      • db.[collectionName].insertOne(object)3.2+ 数据库插入一行数据
      • db.[collectionName].insertMany(object)3.2+ 数据库插入多行数据
      • db.[collectionName].save(object) 指定_id=update(),否则是insert()
    • 更新 db.[collectionName].update(query,update)
      db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
      
1
2
  • 删除 db.[collectionName].remove(query,justOne)
  • 查询 db.[collectionName].find(query, projection)
  • 条件
    • limit(Number)
    • skip(Number)
    • sort() 可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式
    db.col.find({}).limit(5).skip(1).sort({"likes":-1})
    
    // 批量删除
    db.getCollection('cainiao-pref-statistic').deleteMany({ds: 20210715})
    
    // 查询
    db.getCollection('cainiao-pref-statistic').find({ ds: { '$gte': 20210716, '$lte': 20210717 } }).count()
    db.getCollection('cainiao-pref-statistic').find({  })
    
    // 更改状态
    db.getCollection('cainiao-pref-statistic').find({  }).forEach(function(obj) {
        obj.ds = new NumberInt(obj.ds);
        obj.total = new NumberInt(obj.total);
        db.getCollection('cainiao-pref-statistic').save(obj);
    });
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

在mongodb中,Collection类似于传统SQL的table;Document类似于SQL中的一行记录row;Field类似于SQL中的一列column。

# # Mongoose (opens new window) (opens new window)

Mongoose是在node下对MongoDB进行管理的数据对象模型(ODM)库。它管理着数据结构定义、校验、数据之间的关系,并可以使node数据转换成mongodb数据库数据。

    const mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost:27017/test', {useNewUrlParser: true, useUnifiedTopology: true});
    
    const Cat = mongoose.model('Cat', { name: String });
    
    const kitty = new Cat({ name: 'Zildjian' });
    kitty.save().then(() => console.log('meow'));
    
1
2
3
4
5
6
7
8

# # Schema

定义document的结构、默认值、校验等。是一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力。支持schema.pre('save', ...)钩子函数(当model.save()执行时触发);支持schema.plugin()以使用自定义插件。

Schema Type支持如下类型:

  • Boolean
  • Buffer
  • Date
  • Mixed (A generic / flexible data type)
  • Number
  • ObjectId
  • String

Schema API

  • Schema.statics.[Statics-Methods] Model中添加静态方法,this指向Model
  • Schema.methods.[Methods] Model.prototype中添加方法
  • Schema.pre('save/init/remove/validate') 回调钩子。this指向Schema
  • Schema.plugin(self-plugin) 应用插件

# # Model

Model是Schema的包装,具有操作数据库的能力。

  • Model:由Schema发布生成的模型,具有抽象属性和行为的数据库操作。
  • Model.prototyp(这里可以叫Entity)e: 由Model创建的实体,他的操作也会影响* 数据库。
  • 关系:Schema生成Model,Model创造Entity,Model和Entity都可对数据库操作造成影响,但Model比Entity更具操作性。

Model API

  • Model
    • 增
      • Model.create(documents, callback)
      • Model.insertMany()
    • 查
      • Model.find(conditions, [fields], [options], [callback])
      • Model.findById(id, [fields], [options], [callback])
      • Model.findOne(conditions, [fields], [options], [callback])
      • Model.count(conditions, [callback])
    • 改
      • Model.findByIdAndUpdate(id, document, callback)
      • Model.findOneAndUpdate([conditions], [update], [options], [callback])
    • 删
      • Model.remove(conditions, [callback])
      • Model.findByIdAndRemove(id, [options], [callback])
      • Model.findOneAndRemove(conditions, [options], [callback])
  • Model.prototype
    • Model.prototype.save()(callback)
    • Model.prototype.update(query, document, callback)
    • Model.prototype.remove()

Schema类似于SQL的表的定义;Model是一个高层次的接口

    let mongoose = require('mongoose')
    mongoose.connect('mongodb://localhost:27017/test') // 记得先连接到数据库
    
    /** 定义表结构 **/
    let emailSchema = new mongoose.Schema({
      email: String,
      date: Date
    })
    // 回调钩子
    emailSchema.pre('save',  function(next) {
        if(!this.date) this.date = new Date() // this指向Schema
        next()
    })
    // 定义Model静态方法
    emailSchema.statics.getLeoRows = function() {
        return this.find({author: 'leo'}) // this指向Model
    }
    
    /** 定义操作层 **/
    let EmailModel = mongoose.model('Email', emailSchema)
    
    // 静态方法,常用于数据库逻辑
    EmailModel.getLeoRows().then(data => console.log(data))
    
    // 新增
    let msg = new EmailModel({
      email: 'leo'
    })
    msg.save().then(doc => console.log(doc))
    
    // 查询
    EmailModel.find({ email: 'leo' }).then(doc => console.log(doc))
    
    // 更新
    EmailModel.findOneAndUpdate({ email: 'leo' },{ email: 'leoupdate' }.then(doc => console.log(doc))
    
    // 删除
    EmailModel.findOneAndRemove({ email: 'leoupdate'}).then(doc => console.log(doc))
    
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

# # 附上Mysql数据库安装

  1. 安装mysql:https://dev.mysql.com/doc/refman/8.0/en/osx-installation-pkg.html

  2. 命令行操作msql:

    /usr/local/mysql/bin/mysql -u root -p # 输入root密码后即可进入mysql
    # 接下来可操作或设置mysql
    mysql> SHOW DATABASES;
    mysql> CREATE DATABASE pets;
    
1
2
3
4
5

mysql命令入口,MacOS默认地址为:/usr/local/mysql/bin/mysql。所以我们可以更改下终端的Path快捷设置(笔者使用oh my zsh),这样就不用输入路径了:

    vim ~/.zshrc
    export PATH=$HOME/bin:/usr/local/bin:$PATH:/usr/local/mysql/bin # :代表间隔
    
    mysql -u root -p
    
1
2
3
4
5

# # 参考文章

  • mongoose document (opens new window) (opens new window)

  • Introduction to Mongoose for MongoDB (opens new window) (opens new window)

编辑 (opens new window)
Node模块源码分析
常用Node API

← Node模块源码分析 常用Node API→

最近更新
01
theme-vdoing-blog博客静态编译问题
09-16
02
搜索引擎
07-19
03
友情链接
07-19
更多文章>
Theme by Vdoing | Copyright © 2019-2022 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式