Mongoose是 mongodb封装的模块

mongoose安装以及使用

Mongoose有2各特点
1 通过关系型数据库思想,来设计非关系型数据
2 基于mongoDB驱动 ,简化操作


1.安装

  1. npm install mongoose --save

2 引入 mongoose 并连接数据库

  1. const mongoose =require(“mongoose”);

3 建立连接

  1. //没有认证的情况下
  2. mongoose.connect('mongodb://127.0.0.1:27017/chen');
  3. //有密码的情况下 test1 是账户 123456是密码 chen是数据库
  4. mongoose.connect('mongodb://test1:123456@127.0.0.1:27017/chen');
  5. mongoose.connect('mongodb://test1:123456@127.0.0.1:27017/chen', { useNewUrlParser: true, useUnifiedTopology: true }, (err) => {
  6. if (err) {
  7. console.log("连接失败");
  8. return
  9. }
  10. console.log("连接成功");
  11. });

4 获取数据

1.获取数据,先要定义数据表
2.定义model操作数据库

  1. // 定义Schema ,结构与连接数据库表的字段一一对应
  2. //{ "_id" : ObjectId("609780f334b7c2c6f2018ced"), "order_id" : "1", "uid" : 10, "trade_no" : "111", "all_price" : 100, "all_num" : 2 }
  3. var ChenSchema = mongoose.Schema({
  4. order_id: String,
  5. uid: Number,
  6. trade_no: String,
  7. all_price: String,
  8. num: Number
  9. })
  10. module.exports=mongoose.model('Manager',ChenSchema ,'manager');
  11. //第一个参数: 注意2点>>> 1 首字母大写 2. 要和数据库表(集合)名称 对应
  12. //第二个参数: 填入Schema 结构 关联
  13. //第三个参数: 可选 , 如果不填 ,那么它就会默认 读取复数 , 填了 表示读取指定的表
  14. /**注: 什么是复数?
  15. *
  16. * 如果你的第一个参数填入 表名为 order(在数据库存在的) 第三个参数不填,
  17. * 那么它就会默认 读成 orders 这个表,如果你数据库没有这个表,那么读取数据就会空
  18. *
  19. */
  20. //注: 什么是复数?
  21. var OrItem=mongoose.model('Order',UsersSchema)
  22. OrItem.find({},(err,doc)=>{
  23. if (err) {
  24. console.log(err);
  25. return
  26. }
  27. console.log(doc);
  28. })

image.png

5增加数据

  1. let Order = mongoose.model('Order',OrderSchema,"order")

6.1 实列化 model 通过实列化 Order Model 创建增加的数据

6.2 实列.save()

  1. // 实列化 model 通过实列化 Order Model 创建增加的数据
  2. var u= new Order({
  3. order_id: 2,
  4. uid: 652,
  5. trade_no: "5566",
  6. all_price: 22,
  7. num: 7
  8. })
  9. u.save((err)=>{ //执行添加数据
  10. if (err) {
  11. console.log(err);
  12. return
  13. }
  14. console.log("成功");
  15. })//

6 修改数据

第一个对象是,指定数据的id
第二个对象是,指定要修改的数据字段
第三个是回调函数

  1. Order.updateOne(
  2. {"_id":"609956248a80c022ac1235e9"},
  3. {"order_id":"6666"},
  4. (err,doc)=>{
  5. if (err) {
  6. console.log("修改失败");
  7. return
  8. }
  9. console.log(doc);
  10. }
  11. )

7 删除数据

第一个对象是,指定数据的id
第二个是回调函数

  1. Order.deleteOne({"_id":"609956248a80c022ac1235e9"},(err,doc)=>{
  2. if (err) {
  3. console.log("删除失败");
  4. return
  5. }
  6. console.log(doc);
  7. })

mongoDB默认参数

  1. // mongoDB默认参数:增加数据的时候,如果不传入数据会使用默认的数据
  2. var OrderSchema = mongoose.Schema({
  3. order_id: {type:Number,default:0},
  4. uid: {type:Number,default:0},
  5. trade_no: {type:String,default:"默认"},
  6. all_price: {type:Number,default:0},
  7. all_num: {type:Number,default:0},
  8. }, {versionKey: false})

mongoDB模块化

image.png
image.png
image.png

mongoDB的性能

如何知道,连接数据到获取数据的时候话了多长时间?
Order 是被引入的文件名
使用:检测 console.time(“order”) //开始

  1. Console.timeEnd(‘order’) //结束
  2. console.time('order');
  3. var OrderModel = require("./model/order.js");
  4. console.timeEnd('order');
  5. console.time('order_item');
  6. var OrderItemModel = require("./model/order_item.js");
  7. console.timeEnd('order_item');

image.png
表示官网已经给我做了优化了

mongoDB预定义模式修饰符

Lowercase uppercase trim

在我们定义数据表Schema 的时候, 可以在字段里添加

//配置数据模型 要与数据表一一对应上

  1. var OrderSchema = mongoose.Schema({
  2. order_id: {type:Number,default:0},
  3. uid: {type:Number,default:0},
  4. trade_no: {type:String,default:"默认",trim:true},
  5. all_price: {type:Number,default:0},
  6. all_num: {type:Number,default:0},
  7. }, {versionKey: false})

mongoDB 自定义修饰符 Getters和Setters

除了mongoose 内置的修饰符以外,还可以通过set (建议使用)
修饰符在增加数据的时候对数据进行格式化,也可以通过get (不建议使用) 在 实列获取数据 的时候对数据进行格式化

Set()

在配置数据表的 字段中书写 set 来对数据 进行处理 拼接等,也可以过滤等一些操作,还可以防止xss脚本攻击
在set函数中书写 一个参数,这个参数可自行定义, 这个参数就是传进来的实际数据,

set(parmas){
If(parmas){
Reture “http://”+parmas
}

  1. //配置数据模型 要与数据表一一对应上
  2. var OrderItemSchema = mongoose.Schema({
  3. order_id: { type: Number, default: 0 },
  4. title: {
  5. type: String,
  6. default: "默认order_item" ,
  7. trim:true,
  8. set(parmas) { //增加数据的时候对 title字段进行处理
  9. //parmas 是参数 可以获取title的值 ,返回的数据就是title在数据库实际保存的值
  10. /**
  11. *
  12. *www.baidu.com http://www.baidu.com
  13. *http://www.baidu.com http://www.baidu.com
  14. */
  15. if (!parmas) {
  16. return ""
  17. } else {
  18. if (parmas.indexOf("http://") != 0) {
  19. return "http://" + parmas;
  20. } else {
  21. return parmas;
  22. }
  23. }
  24. }
  25. },
  26. price: { type: Number, default: 0 },
  27. num: { type: Number, default: 0 },
  28. }, { versionKey: false })

get()

Get 是获取数据的
Get(parmas){
Reture “a001”+parmas
}

用于 查询数据,当使用find() 获取数据的时候, 会返回附带 a001+parmas的值

  1. //配置数据模型 要与数据表一一对应上
  2. var OrderItemSchema = mongoose.Schema({
  3. order_id: { type: Number, default: 0 },
  4. title: {
  5. type: String,
  6. default: "默认order_item" ,
  7. trim:true,
  8. get(parmas){
  9. return "a001"+parmas
  10. }
  11. },
  12. price: { type: Number, default: 0 },
  13. num: { type: Number, default: 0 },
  14. }, { versionKey: false })

image.png

mongo索引

mongo数据校验

Max
Min
enum:枚举类型,要求数据必须满足枚举值 enum:[‘0’,’1’,’2’],必须用在String的数据类型中
match:增加的数据必须符合 match(正则)的规则,适用于String类型
maxlength:最大长度
minlength:最小长度
required: true 表示这个字段的数据必须填
自定义验证数据

mongodb 数据模型正确写法

错误的写法

image.png
image.png
image.png

正确的写法

构造数据模型
image.png
统一组织导出数据模型
image.png
调用导出的模型类
image.png
或者可以这样, 只不过响应 user 就没有数据了
image.png

Mongodb 数据模型不拉取指定字段

前提条件

find查询指定不显示的数据

  1. 该字段已经设置了, select:false 的属性,表示不拉取 ,当你查询数据的时候, 就不会返回该字段的数据<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/10367081/1644404314242-81568283-3343-4096-bdab-3ed22bbc7e2a.png#clientId=ucd0c502b-c464-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=233&id=uee536edc&margin=%5Bobject%20Object%5D&name=image.png&originHeight=233&originWidth=580&originalType=binary&ratio=1&rotation=0&showTitle=false&size=27824&status=done&style=none&taskId=u6dbc40e0-be53-4a9b-9d12-4b2f9a508e7&title=&width=580)

new数据指定不显示的数据

image.png