zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Mongoose

2023-03-14 22:54:43 时间

一、Mongoose安装及使用

https://mongoosejs.com/

1.安装

npm i mongoose --save

在这里插入图片描述

2.定义schema
数据库中的schema,为数据库对象的集合,schema是mongoose会用到的一种数据模式,可以理解为表结构的定义:每个schema会映射到mongodb中的一个collection。他不具备操作数据库的能力
3.增删改查
const mongoose=require("mongoose")
// 建立连接
mongoose.connect("mongodb://shop2:admin888@127.0.0.1:27017/app")

// 操作user表
// 定义一个schema 里面的对象和数据库表里面的字段需要一一对应
var c1Schema=mongoose.Schema({
    name:String,
    age:Number,
    // Status:Number
})

// 创建数据模型
// var c1=mongoose.model("c1",c1Schema)
var c1=mongoose.model("c1",c1Schema,"c1") //默认会操作第三个参数配置的c1表的(集合)


// 查询数据
// c1.find({},function(err,doc){
//     if(err){
//         console.log(err);
//         return
//     }

//     console.log(doc)
// })

// -----增加数据
// 实例化Model 

// var u=new c1({
//     name:"李四",
//     age:20,
//     status:1
// });
// u.save(function(err){
//     if(err){
//         console.log(err);
//         return
//     }

//     console.log("增加成功")

// })

// ----更新数据

// c1.updateOne({name:"李四"},{name:"张三"},function(err,res){
//     if(err){
//         console.log(err);
//         return
//     }
//     console.log("成功")
// })

// 删除数据

c1.deleteOne({name:"张三"},function(err){
    if(err){
        console.log(err);
        return
    }
    console.log("删除成功")
})

二、预定义模式修饰符 Getters 与 Setters自定义修饰符

1.预定义模式修饰符

lowercase、uppercase、trim

mongoose提供的预定义模式修饰符,可以对增加的数据进行一些格式化

var UserSchema=mongoose.Schema({
    name:{
        type:String,
        trim:true //会给name字段去掉左右空格
    },
    age:Number,
    status:{
        type:Number,
        default:1
        }
})
2.自定义修饰符

在这里插入图片描述

redirect可以对数据库中的网址进行处理

var mongoose = require("./db")
var FocusSchema = mongoose.Schema({
    title: {
        type: String,
        trim: true  //定义模式修饰符去掉空格
    },
    pic: String,
    redirect: {
        type: String,
        set(parmas) {   //增加数据的时候对redirect字段进行处理
            // parmas 可以获取redirect的值,返回的字段就是redirect在数据库中实际保存的值
            /*
            www.baidu.com
            http://www.baidu.com
            */
            if (!parmas) {
                return " "
            } else {
                if (parmas.indexOf("http://") != 0 && parmas.indexOf("https://") != 0) {
                    return "http://" + parmas
                }
                return parmas
            }
        }
    },
    status: {
        type: Number,
        default: 1
    }
})
module.exports = mongoose.model("Focus", FocusSchema, "focus")

set一般对我们格式进行处理,get一般不用

三、索引,内置方法,

1.索引

在这里插入图片描述

在这里插入图片描述

2.内置CURD

http://mongoosejs.com/docs/queries.html

3.静态方法和实例方法
// 

var mongoose = require("./db")

var UserSchema = mongoose.Schema({
    name: {
        type: String,
    },
    sn: {
        type: String,
        index: true
    },
    age: Number,
    status: {
        type: Number,
        default: 1 //默认参数,可以让数据库没有的属性增加到数据库里
    }
})

// 静态方法
UserSchema.statics.findByname = function (name, cb) {

    // 通过find方法获取sn的数据
    // this关键词获取当前的model
    this.find({ "name": name }, function (err, docs) {
        cb(err, docs)
    })
}
// UserModel = mongoose.model("User", UserSchema, "user")
// module.exports=UserModel
module.exports = mongoose.model("User", UserSchema, "user")


//----------------------------------------
//==========================================


var UserModel = require("./model/user2")
var user = new UserModel({
    name: "张飒",
    sn: "123232e34",
    age: 17,
    status: 1
});
user.save()
UserModel.findByname("李四", function (err, data){
    if (err) {
        console.log(err);
        return
    }
    console.log(data)
})

四、数据校验

1.内置数据校验
  • 如果schema没有设置该属性,增加的时候是不会把没有的列添加进去的
  • 如果增加的字段没有schema定义的,也是可以的添加进去的
required: 表示这个数据必须传入

max: 用于number类型数据

min: 用于number类型数据,最小值

enum:

match:增加的数据必须符合match(正则)的规则

// match:/^sn(.*)/i

maxlength:最大值

minlength: 最小值

2.自定义验证器

在这里插入图片描述

在这里插入图片描述

五、aggregate聚合管道

关联查询

在这里插入图片描述


  • $project:选择对应一个字段
  • $match: 条件

    • $group:分组
主要功能:

是将每个输入待处理的文档,经过$lookup 阶段的处理,输出的新文档中会包含一个新生成的数组列(户名可根据需要命名新key的名字 )。
数组列存放的数据是来自被Join 集合的适配文档,如果没有,集合为空(即 为[ ])

基本语法:

{
   $lookup:
     {
       from: <collection to join>,
       localField: <field from the input documents>,
       foreignField: <field from the documents of the "from" collection>,
       as: <output array field>
     }
}

参数说明:

(1)from:同一个数据库下等待被Join的集合。

(2)localField: 源集合中的match值,如果输入的集合中,某文档没有localField,这个Key(Field),在处理的过程中,会默认为此文档含有 localField:null的键值对。

(3)foreignField:待Join的集合的match值,如果待Join的集合中,文档没有foreignField值,在处理的过程中,会默认为此文档含有

foreignField:null的键值对。

(4)as:为输出文档的新增值命名。如果输入的集合中已存在该值,则会覆盖掉。


  • $sort:排序
  • $limit:限制查询几条数据
  • $skip:跳过多少数据
  • $lookup:做表关联

六、populate实现关联查询

//注意使用populate需要用到的model
// ArticleModel.find({}).populate("cid").exec(function(err,data){
//     console.log(data);
// })
ArticleModel.find({}). populate("cid").populate("author_id").exec(function (err, data) {
    console.log(data);
})

@TOC

一、Mongoose安装及使用

https://mongoosejs.com/

1.安装

npm i mongoose --save

在这里插入图片描述

2.定义schema
数据库中的schema,为数据库对象的集合,schema是mongoose会用到的一种数据模式,可以理解为表结构的定义:每个schema会映射到mongodb中的一个collection。他不具备操作数据库的能力
3.增删改查
const mongoose=require("mongoose")
// 建立连接
mongoose.connect("mongodb://shop2:admin888@127.0.0.1:27017/app")

// 操作user表
// 定义一个schema 里面的对象和数据库表里面的字段需要一一对应
var c1Schema=mongoose.Schema({
    name:String,
    age:Number,
    // Status:Number
})

// 创建数据模型
// var c1=mongoose.model("c1",c1Schema)
var c1=mongoose.model("c1",c1Schema,"c1") //默认会操作第三个参数配置的c1表的(集合)


// 查询数据
// c1.find({},function(err,doc){
//     if(err){
//         console.log(err);
//         return
//     }

//     console.log(doc)
// })

// -----增加数据
// 实例化Model 

// var u=new c1({
//     name:"李四",
//     age:20,
//     status:1
// });
// u.save(function(err){
//     if(err){
//         console.log(err);
//         return
//     }

//     console.log("增加成功")

// })

// ----更新数据

// c1.updateOne({name:"李四"},{name:"张三"},function(err,res){
//     if(err){
//         console.log(err);
//         return
//     }
//     console.log("成功")
// })

// 删除数据

c1.deleteOne({name:"张三"},function(err){
    if(err){
        console.log(err);
        return
    }
    console.log("删除成功")
})

二、预定义模式修饰符 Getters 与 Setters自定义修饰符

1.预定义模式修饰符

lowercase、uppercase、trim

mongoose提供的预定义模式修饰符,可以对增加的数据进行一些格式化

var UserSchema=mongoose.Schema({
    name:{
        type:String,
        trim:true //会给name字段去掉左右空格
    },
    age:Number,
    status:{
        type:Number,
        default:1
        }
})
2.自定义修饰符

在这里插入图片描述

redirect可以对数据库中的网址进行处理

var mongoose = require("./db")
var FocusSchema = mongoose.Schema({
    title: {
        type: String,
        trim: true  //定义模式修饰符去掉空格
    },
    pic: String,
    redirect: {
        type: String,
        set(parmas) {   //增加数据的时候对redirect字段进行处理
            // parmas 可以获取redirect的值,返回的字段就是redirect在数据库中实际保存的值
            /*
            www.baidu.com
            http://www.baidu.com
            */
            if (!parmas) {
                return " "
            } else {
                if (parmas.indexOf("http://") != 0 && parmas.indexOf("https://") != 0) {
                    return "http://" + parmas
                }
                return parmas
            }
        }
    },
    status: {
        type: Number,
        default: 1
    }
})
module.exports = mongoose.model("Focus", FocusSchema, "focus")

set一般对我们格式进行处理,get一般不用

三、索引,内置方法,

1.索引

在这里插入图片描述

在这里插入图片描述

2.内置CURD

http://mongoosejs.com/docs/queries.html

3.静态方法和实例方法
// 

var mongoose = require("./db")

var UserSchema = mongoose.Schema({
    name: {
        type: String,
    },
    sn: {
        type: String,
        index: true
    },
    age: Number,
    status: {
        type: Number,
        default: 1 //默认参数,可以让数据库没有的属性增加到数据库里
    }
})

// 静态方法
UserSchema.statics.findByname = function (name, cb) {

    // 通过find方法获取sn的数据
    // this关键词获取当前的model
    this.find({ "name": name }, function (err, docs) {
        cb(err, docs)
    })
}
// UserModel = mongoose.model("User", UserSchema, "user")
// module.exports=UserModel
module.exports = mongoose.model("User", UserSchema, "user")


//----------------------------------------
//==========================================


var UserModel = require("./model/user2")
var user = new UserModel({
    name: "张飒",
    sn: "123232e34",
    age: 17,
    status: 1
});
user.save()
UserModel.findByname("李四", function (err, data){
    if (err) {
        console.log(err);
        return
    }
    console.log(data)
})

四、数据校验

1.内置数据校验
  • 如果schema没有设置该属性,增加的时候是不会把没有的列添加进去的
  • 如果增加的字段没有schema定义的,也是可以的添加进去的
required: 表示这个数据必须传入

max: 用于number类型数据

min: 用于number类型数据,最小值

enum:

match:增加的数据必须符合match(正则)的规则

// match:/^sn(.*)/i

maxlength:最大值

minlength: 最小值

2.自定义验证器

在这里插入图片描述

在这里插入图片描述

五、aggregate聚合管道

关联查询

在这里插入图片描述


  • $project:选择对应一个字段
  • $match: 条件

    • $group:分组
主要功能:

是将每个输入待处理的文档,经过$lookup 阶段的处理,输出的新文档中会包含一个新生成的数组列(户名可根据需要命名新key的名字 )。
数组列存放的数据是来自被Join 集合的适配文档,如果没有,集合为空(即 为[ ])

基本语法:

{
   $lookup:
     {
       from: <collection to join>,
       localField: <field from the input documents>,
       foreignField: <field from the documents of the "from" collection>,
       as: <output array field>
     }
}

参数说明:

(1)from:同一个数据库下等待被Join的集合。

(2)localField: 源集合中的match值,如果输入的集合中,某文档没有localField,这个Key(Field),在处理的过程中,会默认为此文档含有 localField:null的键值对。

(3)foreignField:待Join的集合的match值,如果待Join的集合中,文档没有foreignField值,在处理的过程中,会默认为此文档含有

foreignField:null的键值对。

(4)as:为输出文档的新增值命名。如果输入的集合中已存在该值,则会覆盖掉。


  • $sort:排序
  • $limit:限制查询几条数据
  • $skip:跳过多少数据
  • $lookup:做表关联

六、populate实现关联查询

//注意使用populate需要用到的model
// ArticleModel.find({}).populate("cid").exec(function(err,data){
//     console.log(data);
// })
ArticleModel.find({}). populate("cid").populate("author_id").exec(function (err, data) {
    console.log(data);
})

@TOC

一、Mongoose安装及使用

https://mongoosejs.com/

1.安装

npm i mongoose --save

在这里插入图片描述

2.定义schema
数据库中的schema,为数据库对象的集合,schema是mongoose会用到的一种数据模式,可以理解为表结构的定义:每个schema会映射到mongodb中的一个collection。他不具备操作数据库的能力
3.增删改查
const mongoose=require("mongoose")
// 建立连接
mongoose.connect("mongodb://shop2:admin888@127.0.0.1:27017/app")

// 操作user表
// 定义一个schema 里面的对象和数据库表里面的字段需要一一对应
var c1Schema=mongoose.Schema({
    name:String,
    age:Number,
    // Status:Number
})

// 创建数据模型
// var c1=mongoose.model("c1",c1Schema)
var c1=mongoose.model("c1",c1Schema,"c1") //默认会操作第三个参数配置的c1表的(集合)


// 查询数据
// c1.find({},function(err,doc){
//     if(err){
//         console.log(err);
//         return
//     }

//     console.log(doc)
// })

// -----增加数据
// 实例化Model 

// var u=new c1({
//     name:"李四",
//     age:20,
//     status:1
// });
// u.save(function(err){
//     if(err){
//         console.log(err);
//         return
//     }

//     console.log("增加成功")

// })

// ----更新数据

// c1.updateOne({name:"李四"},{name:"张三"},function(err,res){
//     if(err){
//         console.log(err);
//         return
//     }
//     console.log("成功")
// })

// 删除数据

c1.deleteOne({name:"张三"},function(err){
    if(err){
        console.log(err);
        return
    }
    console.log("删除成功")
})

二、预定义模式修饰符 Getters 与 Setters自定义修饰符

1.预定义模式修饰符

lowercase、uppercase、trim

mongoose提供的预定义模式修饰符,可以对增加的数据进行一些格式化

var UserSchema=mongoose.Schema({
    name:{
        type:String,
        trim:true //会给name字段去掉左右空格
    },
    age:Number,
    status:{
        type:Number,
        default:1
        }
})
2.自定义修饰符

在这里插入图片描述

redirect可以对数据库中的网址进行处理

var mongoose = require("./db")
var FocusSchema = mongoose.Schema({
    title: {
        type: String,
        trim: true  //定义模式修饰符去掉空格
    },
    pic: String,
    redirect: {
        type: String,
        set(parmas) {   //增加数据的时候对redirect字段进行处理
            // parmas 可以获取redirect的值,返回的字段就是redirect在数据库中实际保存的值
            /*
            www.baidu.com
            http://www.baidu.com
            */
            if (!parmas) {
                return " "
            } else {
                if (parmas.indexOf("http://") != 0 && parmas.indexOf("https://") != 0) {
                    return "http://" + parmas
                }
                return parmas
            }
        }
    },
    status: {
        type: Number,
        default: 1
    }
})
module.exports = mongoose.model("Focus", FocusSchema, "focus")

set一般对我们格式进行处理,get一般不用

三、索引,内置方法,

1.索引

在这里插入图片描述

在这里插入图片描述

2.内置CURD

http://mongoosejs.com/docs/queries.html

3.静态方法和实例方法
// 

var mongoose = require("./db")

var UserSchema = mongoose.Schema({
    name: {
        type: String,
    },
    sn: {
        type: String,
        index: true
    },
    age: Number,
    status: {
        type: Number,
        default: 1 //默认参数,可以让数据库没有的属性增加到数据库里
    }
})

// 静态方法
UserSchema.statics.findByname = function (name, cb) {

    // 通过find方法获取sn的数据
    // this关键词获取当前的model
    this.find({ "name": name }, function (err, docs) {
        cb(err, docs)
    })
}
// UserModel = mongoose.model("User", UserSchema, "user")
// module.exports=UserModel
module.exports = mongoose.model("User", UserSchema, "user")


//----------------------------------------
//==========================================


var UserModel = require("./model/user2")
var user = new UserModel({
    name: "张飒",
    sn: "123232e34",
    age: 17,
    status: 1
});
user.save()
UserModel.findByname("李四", function (err, data){
    if (err) {
        console.log(err);
        return
    }
    console.log(data)
})

四、数据校验

1.内置数据校验
  • 如果schema没有设置该属性,增加的时候是不会把没有的列添加进去的
  • 如果增加的字段没有schema定义的,也是可以的添加进去的
required: 表示这个数据必须传入

max: 用于number类型数据

min: 用于number类型数据,最小值

enum:

match:增加的数据必须符合match(正则)的规则

// match:/^sn(.*)/i

maxlength:最大值

minlength: 最小值

2.自定义验证器

在这里插入图片描述

在这里插入图片描述

五、aggregate聚合管道

关联查询

在这里插入图片描述


  • $project:选择对应一个字段
  • $match: 条件

    • $group:分组
主要功能:

是将每个输入待处理的文档,经过$lookup 阶段的处理,输出的新文档中会包含一个新生成的数组列(户名可根据需要命名新key的名字 )。
数组列存放的数据是来自被Join 集合的适配文档,如果没有,集合为空(即 为[ ])

基本语法:

{
   $lookup:
     {
       from: <collection to join>,
       localField: <field from the input documents>,
       foreignField: <field from the documents of the "from" collection>,
       as: <output array field>
     }
}

参数说明:

(1)from:同一个数据库下等待被Join的集合。

(2)localField: 源集合中的match值,如果输入的集合中,某文档没有localField,这个Key(Field),在处理的过程中,会默认为此文档含有 localField:null的键值对。

(3)foreignField:待Join的集合的match值,如果待Join的集合中,文档没有foreignField值,在处理的过程中,会默认为此文档含有

foreignField:null的键值对。

(4)as:为输出文档的新增值命名。如果输入的集合中已存在该值,则会覆盖掉。


  • $sort:排序
  • $limit:限制查询几条数据
  • $skip:跳过多少数据
  • $lookup:做表关联

六、populate实现关联查询

//注意使用populate需要用到的model
// ArticleModel.find({}).populate("cid").exec(function(err,data){
//     console.log(data);
// })
ArticleModel.find({}). populate("cid").populate("author_id").exec(function (err, data) {
    console.log(data);
})