mongoose

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: mongoose

mongoose

mongoose 是 node 中提供操作 MongoDB 的模块

能够通过 node 语法实现 MongoDB 数据库的增删改查

下载方式

npm i mongoose

yarn add mongoose (推荐)

语法:

// 一, 导入模块
const mongoose = require('mongoose')
// 二, 连接数据库
const db = mongoose.createConnection('mongodb://user:pass@localhost:port/database', {
    useNewUrlParser: true, useUnifiedTopology: true}, err=>{
        if(err){
            console.log('------------------')
            console.log('数据库连接失败')
            console.log('-------------------');
            return
        }
        console.log('数据库连接成功');
    })
// 三, 设置数据模型 (声明是哪个集合, 限制字段个数和字段类型)
const model = db.model('user',{
    name:{type:String, defalut:'username'},
    age: {tyoe: Number},
    sex: {type: String}
})
// 四, 创建实例操作
//增---------------------------------------------
const insertObj = new model(数据对象)
// 方法1: insertObj.save((err) => db.close())
// 方法二:
    insertObj.save()
    .then(res=>{
        return res
    })
    .catch(err => {
        console.log('插入失效' + err)
        return false
    })
// 删------------------------------------------
// 方法一: model.remove/deleteOne/deleteMany(条件对象, (err) => db.close())
// 方法二:
    model.deleteOne(条件对象)
    .then(res => {
        return res.deletedCount
    })
    .catch(err => {
        console.log('删除失败' + err)
        return false
    })
// 改---------------------------------------------
// 方法一: model.update/updateOne/updateMany(条件对象, 数据对象, (err) => db.close())
// 方法二
model.updateOne(条件对象, 数据对象)
.then(res => {
    return res.nModified
})
.catch(err => {
    console.log('修改失败' + err)
    return false
})
// 查--------------------------------------------------
// 方法一: model.find/findOne(条件对象, 要显示的字段数据对象, (err, result) => db.close())
// 方法二:
model.findOne(条件对象)
.then(res => {
    return res
})
.catch(err => {
    console.log('查找失败' + err)
    return false
})

数据库连接状态

  1. connect() 返回的是一个待定状态, 在 mongoose中有一个属性叫 connection 用来表示数据库的连接
  2. 通过监视改对象可以用来监听数据库的连接与断开
  3. 数据库连接成功事件

mongoose.connection.once(‘open’, () => {})

  1. 数据库断开事件

mongoose.connection.once(‘close’, () => {})

schema

数据库中的schema为数据库对象的集合,是mongoose里会用到的一种数据模式,可以理解为表结构的定义,每个 schema 都会映射到一个 MongoDB collection ,并定义这个collection里的文档的构成.

var stuSchema = new Schema({})

Mongoose 的一切始于 Schema

作用: 用来约束 MongoDB文档数据

model

Models 是从 Schema 编译来的构造函数。

var stuModel = mongoose.model('student', stuSchema)

要映射的集合名, 创建的约束(Schema对象)

后面我们通过模型来管理集合中的数据

接口概念

就是一个文件(js\json\php)等, 主要响应JSON数据( 操作方便,体积小 ) 或 XML数据

{
  status: 1/0,
  msg: '提示信息'
}
------------------
<xml>
  <status>1.0</status>
  <msg>提示信息</msg>
</xml>

只要响应json数据所有语言都可以操作, 例如ios/Android等

推荐

{
  meta: {
    msg: 提示信息,
    status: 状态码 (200/201/301/302/400/401/403/404/500)
  },
  data: 数据
}

接口开发规范 Restful API

  • 项目所有模块有统一的标准
  • 看URL就知道要操作的资源是什么
  • 看Http Method 就知道操作动作是什么, 是添加(post) 还是删除(delete)
  • 看Http Status Code 就知道操作结果如何, 是成功(200) 还是内部错误

常用的http状态码及使用场景:

状态码 使用场景
400 bad request 常用在参数校验
401 unauthorized 未经验证的用户,常见于未登录。如果经过验证后依然没权限,应该 403(即 authentication 和 authorization 的区别)
403 forbidden 资源不存在 无权限
404 not found
500 internal server error 非业务类异常
503 service unavaliable 由容器抛出,自己的代码不要抛这个异常

接口文档开发

apiDoc是node.js中的一个模块,通过这个模块可以快速生成接口文档.

前提写接口的时候把注释加上

用法

  1. 下载模块, 后期根据命令基于注释生成文档(仅一次)

npm install apidoc -g

  1. 在项目根目录创建 apidoc.json文件(仅一次)
{
  "name": "example",
  "version": "0.1.0",
  "description": "apiDoc basic example",
  "title": "Custom browser title",
  "url": "https://api.github.com/v1"
}
  1. 写接口注释
/**
 * @api {get} /stu  学生模块列表
 * @apiName Add
 * @apiGroup stu
 *
 * @apiParam {Number}   pageno       当前页
 *@apiParam {Number}    pagesize     每页显示条数
 * @apiSuccess {String} meta         状态码&提示信息
 * @apiSuccess {String} data         数据
 **/
  1. 生成接口文档
apidoc -i ./接口注释目录 -o ./接口文档存放目录

预定义模式修饰符

let MenuSchema = mongoose.Schema({
    name:{
      type:String,
      trim: true  //定义mongoose模式修饰符  去掉空格
    },
    age:Number,
    status: Number,
  });

自定义修饰符

set()

let MenuSchema = mongoose.Schema({
    name:String,
    age:Number,
    status: Number,
    pic: {
      type:String,
      set(url){ //增加数据的时候对pic字段进行处理
                //url 可以获取pic的值, 返回的数据就是pic在数据库实际保存的值
          if(!url) {
            return ''
          } else {
            if(url.indexOf('http://') != 0 && url.indexOf('https://') != 0) {
              return 'http://' + url
            }
            return url
          }
      }
    }
  });

get() 一般无用

let MenuSchema = mongoose.Schema({
    name:{
      type:String,
      trim: true,  //定义mongoose模式修饰符  去掉空格
      get(params) {
        return "200" + params
      }
    },
    age:Number,
    status: Number,
  });

set会存在数据库,get不会

索引

优化查询的速度

let MenuSchema = mongoose.Schema({
    sn: {
        type:Number,
        // 唯一索引
        unique: true
    },
    name: {
        type: String,
        // 普通索引
        index: true
    }
})

静态方法

//通过find方法获取 sn的数据, this关键字获取当前的model
MenuSchema.statics.findBySn=function (sn, cb) {
    this.find({"name":sn}, function (err, docs) {
      cb(err,docs)
    })
}

数据校验

required:  //数据必须传入
max: //用于Number 类型数据, 最大值
min: //用于Number 类型数据, 最小值
enum: //枚举类型,要求数据必须满足枚举值 ['0','1','3']
match: //增加的数据必须符号match (正则)的规则 用在string类型
maxlength: //最大长度
minlength: //最小长度

validate 自定义校验

validate: function(sn) {
  return sn.length >= 10
}

聚合管道

两个表的关联

menumodel.aggregate([
    {
        $lookup: {
            from: "order_item", //要关联的表
            localField: "data", // 主表要关联的字段
            foreignField: "data", //副表要关联的字段
            as:"items"  //关联后的数据存放的地方
        }
    },
        {
            $match: {id: mongoose.Types.ObjectId('')} //通过objectid查找数据
        }
], (err, docs) => {
    if(err) {
        console.log(err)
        return;
    }
    console.log(JSON.stringify(docs));
})

多个表的关联


相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
3月前
egg.js 24.10sequelize模型-查询单个
egg.js 24.10sequelize模型-查询单个
34 1
egg.js 24.10sequelize模型-查询单个
|
10月前
|
JavaScript NoSQL MongoDB
100 # mongoose 的使用
100 # mongoose 的使用
45 0
|
9月前
|
网络协议 IDE Linux
mongoose使用详细 -- 如何通过mongoose搭建服务器
mongoose使用详细 -- 如何通过mongoose搭建服务器
593 0
|
2月前
|
JavaScript NoSQL 数据库连接
使用Nodejs + express连接数据库mongoose
【6月更文挑战第3天】这篇文章介绍了如何在Express应用中使用Mongoose连接MongoDB数据库。首先,需要创建一个`db.js`文件,然后通过`npm install mongoose`安装Mongoose驱动。接着,在应用中引入MongoDB模块,建立到数据库的连接。创建一个Mongoose schema定义数据模型,如用户信息表。最后,执行数据库操作,包括查询、插入、更新和删除文档,并在完成后关闭数据库连接。文中还提供了相关代码示例。
163 1
|
3月前
egg.js 24.11sequelize模型-查询多个和获取器
egg.js 24.11sequelize模型-查询多个和获取器
50 0
egg.js 24.11sequelize模型-查询多个和获取器
|
12月前
|
NoSQL JavaScript 关系型数据库
Mongoose-开篇
Mongoose 概述 • Mongoose和MySQL的Sequelize一样, 都是NodeJS中操作数据库的对象模型工具 • Mongoose使用面向对象的思想对原生的mongoDB命令进行了封装
72 0
|
JavaScript
vite无法使用require,require is not defined
vite无法使用require,require is not defined
470 0
|
NoSQL MongoDB
mongoose之bulkWrite
mongoose之bulkWrite
105 0
|
NoSQL MongoDB 数据库
Mongoose
定义schema 数据库中的schema,为数据库对象的集合,schema是mongoose会用到的一种数据模式,可以理解为表结构的定义:每个schema会映射到mongodb中的一个collection。他不具备操作数据库的能力
106 0
Mongoose
|
数据库 开发者
你知道mongoose中的 __v么
mongoose 在添加数据的时候,会默认给你加上一个属性__v,这个属性的全称是__version,顾名思义是版本的意思,作用是给每一个文档加上版本控制,防止并发来修改数据库的数据。
你知道mongoose中的 __v么