mongoose的好处
- 可以为文档创建一个模式结构(Schema)
- 可以对模型中的对象/文档进行验证
- 数据可以通过类型转换转换为对象模型
- 可以使用中间件来应用业务逻辑挂钩
- 比Node原生的MongoDB驱动更容易
安装
npm i -S mongoose
config/db.config.js
// 1.引入mongoose
const mongoose = require("mongoose");
// 2.连接mongodb数据库
// 指定连接数据库后不需要存在,当你插入第一条数据库后会自动创建数据库
/*
mongoose.connect('mongodb://数据库地址:端口号/数据库名',{useMongoClient:true})
如果端口号是默认端口号(27017)则可以省略不写
*/
mongoose.connect("mongodb://localhost:27017/ds2", {
useNewUrlParser: true,
useUnifiedTopology: true,
});
// 3.监听mongodb数据库的连接状态
// 绑定数据库连接成功事件
mongoose.connection.once("open", function () {
console.log("连接成功");
});
// 绑定数据库连接失败事件
mongoose.connection.once("close", function () {
console.log("数据库连接已经断开");
});
// 4.断开数据库连接(一般不用)
mongooes.disconnect();
注:MongoDB数据库,一般情况下,只需要连接一次,连接一次后,除非项目停止服务器关闭,否则连接一般不会断开
在bin目录下的www文件中使用直接require(“…/config/db.config.js”)进行数据库连接的启动

数据库中的 Schema,为数据库对象的集合。schema 是 mongoose 里会用到的一种数据模式,可以理解为表结构的定义;每个 schema会映射到 mongodb 中的一个 collection,它不具备操作数据库的能力。
| 类型 | 作用 |
|---|---|
| String | 定义字符串 |
| Number | 定义数字 |
| Date | 定义日期 |
| Buffer | 定义二进制 |
| Boolean | 定义布尔值 |
| Mixed | 定义混合类型 |
| ObjectId | 定义对象ID |
| Array | 定义数组 |
model/UserModel.js
const mongoose = require("mongoose")
const Schema=mongooes.Schema;
//创建模式对象
const UserType=new Schema({
name:{
type: 'string',
//添加约束,保证数据的完整性,让数据按规矩统一
require: true
},
age:Number,
gender:{
type:String,
// 默认值
default:'female'
},
address:String
})
//创建模型对象
//通过Schema来创建Model
//Model代表的是数据库中的集合,通过Model才能对数据库进行操作
//mongoose.model(modelName,schema)
//建立映射关系,students是集合,mongoose会自动将集合变成复数比如student会变成students
//大写也会被自动转换为小写,比如Users会变成users
const UserModel=mongoose.model("UserModel",UserType,"user");
//第一个参数表示创建的集合的名称,第二个参数表示利用的模式对象,第三个参数是强行指定集合名称
module.exports = UserModel

案例:
var mongoose = require('mongoose')
const UserModel = require('../model/UserModel');
//链式调用 通过new 一个Model创建一个 document
new UserModel({
name:"小明",age:18}).save((err,docs) => {
if(!err){
console.log(docs)
res.send({
code: 200,
data: {
id: docs._id,
},
})
//{ _id: 6017bd1cf4cc8544d8ed2a8a, name: '小明', age: 18, __v: 0 }
}
})
操作模型
Model.create(doc(s), [callback])
参数:
[doc(s)]:文档对象或文档对象数组
[callback]:回调函数
var mongoose = require('mongoose')
const UserModel = require('../model/UserModel');
UserModel.create({
name:"小明",age:18},{
name:"小红",age:10},(err,doc1,doc2) => {
if(!err){
console.log(doc1)
//{ _id: 6017be2d77c8dd01242624bb, name: '小明', age: 18, __v: 0 }
console.log(doc2)
//{ _id: 6017be2d77c8dd01242624bc, name: '小红', age: 10, __v: 0 }
}
})
其它:
//Model.createOne(doc, [callback]); 创建一个对象
//Model.createMany(doc, [callback]); 创建多个对象
// -doc是需要插入的文档
// -callback(err) 是回调函数,可以用来提示是否创建成功了
UserModel.insertMany({
name:"小明",age:18},{
name:"小芳",age:14},(err,docs) => {
if(!err){
console.log(docs)
/*[{ _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 },
{ _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 }]*/
}
})
| _id | name | grades | __v |
|---|---|---|---|
| 6017befb5c36d64d08b72576 | 小明 | 68 | 0 |
| 6017befb5c36d64d08b72577 | 小芳 | 94 | 0 |
| 6017c455ba09d355a49ec8eb | 小红 | 52 | 0 |
| 6017c455ba09d355a49ec8ec | 小刚 | 46 | 0 |
Model.find(conditions, [projection], [options], [callback])
参数
conditions:查询条件
[projection]:控制返回字段
[options]:配置查询参数
[callback]:回调函数–function(err,docs){}
案例:
var mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student',(err) => {
if(!err){
var schema = new mongoose.Schema({
name:String,grades:Number})
var stuModel = mongoose.model('grades',schema)
//查询所有数据
stuModel.find((err,docs) => {
if(!err){
console.log(docs)
}
})
/* [{ _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 },
{ _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 },
{ _id: 6017c455ba09d355a49ec8eb, name: '小红', grades: 52, __v: 0 },
{ _id: 6017c455ba09d355a49ec8ec, name: '小刚', grades: 46, __v: 0 }]*/
//查询成绩大于60以上的数据
stuModel.find({
grades:{
$gte:60}},(err,docs) => {
if(!err){
console.log(docs)
}
})
/*[{ _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 },
{ _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 }]*/
//查询成绩大于60以上且名字里存在‘芳’的数据
stuModel.find({
name:/芳/,grades:{
$gte:60}},(err,docs) => {
if(!err