Mongoose是 mongodb封装的模块
mongoose安装以及使用
Mongoose有2各特点
1 通过关系型数据库思想,来设计非关系型数据
2 基于mongoDB驱动 ,简化操作
1.安装
npm install mongoose --save
2 引入 mongoose 并连接数据库
const mongoose =require(“mongoose”);
3 建立连接
//没有认证的情况下
mongoose.connect('mongodb://127.0.0.1:27017/chen');
//有密码的情况下 test1 是账户 123456是密码 chen是数据库
mongoose.connect('mongodb://test1:123456@127.0.0.1:27017/chen');
mongoose.connect('mongodb://test1:123456@127.0.0.1:27017/chen', { useNewUrlParser: true, useUnifiedTopology: true }, (err) => {
if (err) {
console.log("连接失败");
return
}
console.log("连接成功");
});
4 获取数据
1.获取数据,先要定义数据表
2.定义model操作数据库
// 定义Schema ,结构与连接数据库表的字段一一对应
//{ "_id" : ObjectId("609780f334b7c2c6f2018ced"), "order_id" : "1", "uid" : 10, "trade_no" : "111", "all_price" : 100, "all_num" : 2 }
var ChenSchema = mongoose.Schema({
order_id: String,
uid: Number,
trade_no: String,
all_price: String,
num: Number
})
module.exports=mongoose.model('Manager',ChenSchema ,'manager');
//第一个参数: 注意2点>>> 1 首字母大写 2. 要和数据库表(集合)名称 对应
//第二个参数: 填入Schema 结构 关联
//第三个参数: 可选 , 如果不填 ,那么它就会默认 读取复数 , 填了 表示读取指定的表
/**注: 什么是复数?
*
* 如果你的第一个参数填入 表名为 order(在数据库存在的) 第三个参数不填,
* 那么它就会默认 读成 orders 这个表,如果你数据库没有这个表,那么读取数据就会空
*
*/
//注: 什么是复数?
var OrItem=mongoose.model('Order',UsersSchema)
OrItem.find({},(err,doc)=>{
if (err) {
console.log(err);
return
}
console.log(doc);
})
5增加数据
let Order = mongoose.model('Order',OrderSchema,"order")
6.1 实列化 model 通过实列化 Order Model 创建增加的数据
6.2 实列.save()
// 实列化 model 通过实列化 Order Model 创建增加的数据
var u= new Order({
order_id: 2,
uid: 652,
trade_no: "5566",
all_price: 22,
num: 7
})
u.save((err)=>{ //执行添加数据
if (err) {
console.log(err);
return
}
console.log("成功");
})//
6 修改数据
第一个对象是,指定数据的id
第二个对象是,指定要修改的数据字段
第三个是回调函数
Order.updateOne(
{"_id":"609956248a80c022ac1235e9"},
{"order_id":"6666"},
(err,doc)=>{
if (err) {
console.log("修改失败");
return
}
console.log(doc);
}
)
7 删除数据
第一个对象是,指定数据的id
第二个是回调函数
Order.deleteOne({"_id":"609956248a80c022ac1235e9"},(err,doc)=>{
if (err) {
console.log("删除失败");
return
}
console.log(doc);
})
mongoDB默认参数
// mongoDB默认参数:增加数据的时候,如果不传入数据会使用默认的数据
var OrderSchema = mongoose.Schema({
order_id: {type:Number,default:0},
uid: {type:Number,default:0},
trade_no: {type:String,default:"默认"},
all_price: {type:Number,default:0},
all_num: {type:Number,default:0},
}, {versionKey: false})
mongoDB模块化
mongoDB的性能
如何知道,连接数据到获取数据的时候话了多长时间?
Order 是被引入的文件名
使用:检测 console.time(“order”) //开始
Console.timeEnd(‘order’) //结束
console.time('order');
var OrderModel = require("./model/order.js");
console.timeEnd('order');
console.time('order_item');
var OrderItemModel = require("./model/order_item.js");
console.timeEnd('order_item');
mongoDB预定义模式修饰符
Lowercase uppercase trim
在我们定义数据表Schema 的时候, 可以在字段里添加
//配置数据模型 要与数据表一一对应上
var OrderSchema = mongoose.Schema({
order_id: {type:Number,default:0},
uid: {type:Number,default:0},
trade_no: {type:String,default:"默认",trim:true},
all_price: {type:Number,default:0},
all_num: {type:Number,default:0},
}, {versionKey: false})
mongoDB 自定义修饰符 Getters和Setters
除了mongoose 内置的修饰符以外,还可以通过set (建议使用)
修饰符在增加数据的时候对数据进行格式化,也可以通过get (不建议使用) 在 实列获取数据 的时候对数据进行格式化
Set()
在配置数据表的 字段中书写 set 来对数据 进行处理 拼接等,也可以过滤等一些操作,还可以防止xss脚本攻击
在set函数中书写 一个参数,这个参数可自行定义, 这个参数就是传进来的实际数据,
set(parmas){
If(parmas){
Reture “http://”+parmas
}
//配置数据模型 要与数据表一一对应上
var OrderItemSchema = mongoose.Schema({
order_id: { type: Number, default: 0 },
title: {
type: String,
default: "默认order_item" ,
trim:true,
set(parmas) { //增加数据的时候对 title字段进行处理
//parmas 是参数 可以获取title的值 ,返回的数据就是title在数据库实际保存的值
/**
*
*www.baidu.com http://www.baidu.com
*http://www.baidu.com http://www.baidu.com
*/
if (!parmas) {
return ""
} else {
if (parmas.indexOf("http://") != 0) {
return "http://" + parmas;
} else {
return parmas;
}
}
}
},
price: { type: Number, default: 0 },
num: { type: Number, default: 0 },
}, { versionKey: false })
get()
Get 是获取数据的
Get(parmas){
Reture “a001”+parmas
}
用于 查询数据,当使用find() 获取数据的时候, 会返回附带 a001+parmas的值
//配置数据模型 要与数据表一一对应上
var OrderItemSchema = mongoose.Schema({
order_id: { type: Number, default: 0 },
title: {
type: String,
default: "默认order_item" ,
trim:true,
get(parmas){
return "a001"+parmas
}
},
price: { type: Number, default: 0 },
num: { type: Number, default: 0 },
}, { versionKey: false })
mongo索引
mongo数据校验
Max
Min
enum:枚举类型,要求数据必须满足枚举值 enum:[‘0’,’1’,’2’],必须用在String的数据类型中
match:增加的数据必须符合 match(正则)的规则,适用于String类型
maxlength:最大长度
minlength:最小长度
required: true 表示这个字段的数据必须填
自定义验证数据
mongodb 数据模型正确写法
错误的写法
正确的写法
构造数据模型
统一组织导出数据模型
调用导出的模型类
或者可以这样, 只不过响应 user 就没有数据了
Mongodb 数据模型不拉取指定字段
前提条件
find查询指定不显示的数据
该字段已经设置了, 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)