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状态码及使用场景:

状态码使用场景
400bad request 常用在参数校验
401unauthorized 未经验证的用户,常见于未登录。如果经过验证后依然没权限,应该 403(即 authentication 和 authorization 的区别)
403forbidden 资源不存在 无权限
404not found
500internal server error 非业务类异常
503service 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));
})

多个表的关联

<think>好的,用户想了解MongooseNode.js中的使用方法和可能遇到的问题。首先,我需要整理Mongoose的基本概念,安装步骤,以及核心功能。根据提供的引用内容,Mongoose是一个ODM库,帮助在Node.js中更方便地操作MongoDB。 首先,安装部分需要明确。引用1提到使用npm安装,所以应该写出安装命令。然后,连接数据库的步骤,如mongoose.connect的用法,需要包括示例代码和注意事项,比如关闭警告。 接下来是Schema和Model的定义,引用2中有创建Schema和Model的例子,应该详细说明如何定义字段类型、添加实例方法,以及如何生成Model。同时,要提到中间件和校验器,这些是高级功能,用户可能会遇到相关问题。 数据操作部分,CRUD操作是重点。需要分别给出创建、查询、更新和删除的示例代码,比如使用save()、find()、updateOne()、deleteOne()等方法。同时,结合引用3的内容,强调MongoDBNode.js的兼容性,以及Mongoose如何简化这些操作。 然后,常见问题及解决方法。这里需要总结典型问题,比如连接失败、模式不匹配、异步操作问题、索引优化和验证失败。每个问题都要给出解决建议,比如检查URI、使用严格模式、处理Promise等。 最后,生成相关问题,覆盖安装、核心概念、数据操作、校验、性能优化和应用场景,确保用户能全面了解Mongoose的使用。 需要确保所有代码示例正确,符合引用中的例子,比如Schema和Model的创建。同时,注意使用中文,避免技术术语错误,保持回答结构清晰。可能还需要检查是否有遗漏的重要功能,比如聚合管道或插件,但根据引用内容,主要覆盖基础操作和常见问题即可。</think>### MongooseNode.js中的核心应用指南 #### 一、环境安装与配置 1. 安装命令: ```bash npm install mongoose ``` 2. 数据库连接示例(含错误处理): ```javascript const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost:27017/mydb', { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => console.log('连接成功')) .catch(err => console.error('连接失败:', err)); ``` 注意:Mongoose 6.x版本后已自动启用新解析器和拓扑监控,可省略配置参数[^1] #### 二、数据建模核心要素 1. **Schema定义**(支持28种数据类型): ```javascript const productSchema = new mongoose.Schema({ name: { type: String, required: true }, price: { type: Number, min: [0, '价格不能为负'] }, stock: { type: Number, default: 0 }, tags: [String], createdAt: { type: Date, default: Date.now } }); ``` 2. **Model生成**(自动映射集合): ```javascript const Product = mongoose.model('Product', productSchema); ``` 3. **文档操作**(完整CRUD示例): ```javascript // 创建文档 const newProduct = new Product({ name: '鼠标', price: 99 }); await newProduct.save(); // 查询文档 const products = await Product.find({ price: { $gt: 50 } }).limit(10); // 更新文档 await Product.updateOne( { _id: productId }, { $inc: { stock: 5 } } ); // 删除文档 await Product.deleteOne({ stock: 0 }); ``` #### 三、高级功能实践 1. **中间件应用**(pre/post钩子): ```javascript productSchema.pre('save', function(next) { if (this.isNew) { this.createdAt = Date.now(); } next(); }); ``` 2. **查询链构建**: ```javascript Product.find() .where('price').gt(100) .sort('-createdAt') .populate('category') .exec(); ``` 3. **数据验证增强**: ```javascript email: { type: String, validate: { validator: v => /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(v), message: props => `${props.value} 不是有效邮箱` } } ``` #### 四、典型问题解决方案 1. **连接池优化**: ```javascript // 在连接配置中添加 const options = { poolSize: 10, // 默认5 serverSelectionTimeoutMS: 5000 } ``` 2. **模式严格模式冲突**: ```javascript const schema = new Schema({...}, { strict: 'throw' }); ``` 3. **异步操作异常捕获**: ```javascript try { await doc.save(); } catch (err) { if (err.name === 'ValidationError') { console.log(err.errors); } } ``` 4. **索引优化建议**: ```javascript productSchema.index({ name: 1, price: -1 }, { unique: true }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿选不出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值