一、连接数据库(默认端口号27017)
mongoose.connect('mongodb://user:pass@localhost:port/database');
例:
mongoose.connect('mongodb://127.0.0.1:27017/dbname', (err, data) => { ... })
二、定义骨架:数据结构声明,不能操作数据库
var userSchema = new mongoose.Schema({字段名:类型/默认值})
例:
var userSchema = new mongoose.Schema({name:String});
var userSchema = new mongoose.Schema({name:'小红'});
var userSchema = new mongoose.Schema({name:{
type: String,
default: '小红'
});
1.参数校验
- required:必须传入
- max:用于Number类型,最大值
- min:用于Number类型,最小值
- enum: 用于String类型,必须满足枚举值(例:enum:[0,1,2] 那么值必须是这三个枚举值其中一个)
- match: 增加的数据必须符合正则match规则
- maxlength: 最大长度
- minlength:最小长度
const UserSchema = new mongoose.Schema({
name:{
type: String,
required: true
}
})
2.自定义校验:validate
const UserSchema = new mongoose.Schema({
name:{
type: String,
required: true,
validate:function(name) {
return name.length <= 10;
}
}
})
1.预定义模式修饰符:lowsercase、uppercase、trim、index
var userSchema = new mongoose.Schema({
name:{
type: String,
trim: true //去除首尾空白
}
})
2.自定义修饰符:Getters、Setters
var userSchema = new mongoose.Schema({
name:{
type: String,
set(params) {
if(!params) {
return '';
} else {
if(params.indexOf('https://') != 0) {
return 'https://' + params;
}
return params;
}
}
}
})
3.添加字段使用add():
userSchema.add({age:'String'});
4.静态方法:statics
// 定义静态方法
UserSchema.statics.findByAge = function(age,cb) {
this.find({"age":age),function(err,docs) {
cb(err,docs);
}
}
// 使用
UserSchema.findByAge(12,function(){
if(err) {
console.log(err);
return;
}
console.log(docs);
})
5.实例方法:methods
UserSchema.methods.print = function() {
console.log('实例方法');
}
三、创建模型:根据骨架创建,可读取数据库
var user = mongoose.model(数据库集合名, 骨架名);
四、创建实例:根据模型创建,可操作数据库
创建方法一:
var user1 = new user();
创建方法二:
var user1 = new user({name:'用户1'});
创建方法三:
user.create({name:'用户1'}, (err, data) => { ... });
五、给实例添加删除数据
user1.name = '用户1';
user1.save((err, data) => { ... }); //保存到数据库中
user1.remove((err, data) => { ... }); //删除数据
六、查询
1.模型.find({条件}, (err, data) => { ... }):返回数组
user.find({name:'用户1'}, (err, data) => { ... });
(1)将回调函数放到find()方法外 ,使得取得的数据可以链式调用limit()、skip()等方法:
模型.find({条件}).exec((err, data) => { ... }):返回数组
user.find({name:'用户1'}).exec((err, data) => { ... }).limit(3)
2.模型.findById(id):返回一个对象(一条数据或null)
user.findById('2255565656', (err, data) => { ... });
七、修改
1.找到数据后直接修改数据属性,保存到数据库
user.find({name:'用户1',(err, data) => {
var user1 = data[0];
user1.age = 12;
user1.save();
}}
2.找到数据后用set()修改数据,保存到数据库
user.find({name:'用户1',(err, data) => {
var user1 = data[0];
user1.set({age: 12});
user1.save();
}}
3.仅需要更新而不需要获取该数据:模型.update({条件},{$set:{修改的数据}}, 回调函数)
user.update({name:'用户1'}, {$set:{age:12}}, (err, data) => { ... })
4.模型.findByIdAndUpdate(id,{$set:{修改的数据}}, 回调函数)
user.update('1421221212', {$set:{age:12}}, (err, data) => { ... })
八、聚合
1.通过某个字段连接两个以上集合
语法:
model.aggreate([
{
$lookup:{
from: '另一集合名',
localField: '原model与另一集合相关的字段名',
foreignField:'另一集合相关的字段名',
as:"生成新的对象名"
}
}
])
例子:
// 引入mongoose
const mongoose = require('mongoose');
// 连接mongodb
mongoose.connect('mongodb://127.0.0.1:27017/mydb', {
useNewUrlParser: true
}, function (err, data) {
if (err) {
console.log(err)
} else {
console.log('connect success');
}
});
//创建学生
const StudentSchema = new mongoose.Schema({
name: String,
age:Number,
teacher_id: mongoose.Schema.Types.ObjectId
})
const Student = mongoose.model('Student', StudentSchema, 'student')
let student1 = new StudentModel({
name: '小黄',
age: 12,
teacher_id: '5e97df376e5dd54c6eca4305'
})
student1.save()
//创建教师
const TeacherSchema = new mongoose.Schema({
name: String,
age: Number
})
const Teacher = mongoose.model('Teacher', TeacherSchema, 'teacher')
let teacher1 = new TeacherModel({
name:'放老师',
age:30
})
teacher1.save();
//将教师的数据聚合到学生的数据里
StudentModel.aggregate([
{
$lookup:{
from: "teacher",
localField: 'teacher_id',
foreignField:"_id",
as:"teacher"
}
}
], function (err, docs) {
if(err) {
console.log(err);
return ;
}
console.log(JSON.stringify(docs))
})
//返回的数据
[{
"_id": "5e97e1008648d1448e4dc3fa",
"name": "小黄",
"age": 12,
"teacher_id": "5e97df376e5dd54c6eca4305",
"__v": 0,
"teacher": [{
"_id": "5e97df376e5dd54c6eca4305",
"name": "张老师",
"age": 35,
"__v": 0
}]
}]
//将学生的数据聚合到教师的数据里
TeacherModel.aggregate([
{
$lookup:{
from:'student',
localField:'_id',
foreignField: 'teacher_id',
as:'students'
}
}
],function(err,docs) {
if(err) return;
console.log(JSON.stringify(docs))
})
//返回的数据
[{
"_id": "5e97df376e5dd54c6eca4305",
"name": "张老师",
"age": 35,
"__v": 0,
"students": [{
"_id": "5e97e0f73dae1a4e264d130a",
"name": "小红",
"age": 12,
"teacher_id": "5e97df376e5dd54c6eca4305",
"__v": 0
}, {
"_id": "5e97e0fb3359344c86caedd0",
"name": "小白",
"age": 12,
"teacher_id": "5e97df376e5dd54c6eca4305",
"__v": 0
}, {
"_id": "5e97e1008648d1448e4dc3fa",
"name": "小黄",
"age": 12,
"teacher_id": "5e97df376e5dd54c6eca4305",
"__v": 0
}]
}]