Mongoose

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 定义schema数据库中的schema,为数据库对象的集合,schema是mongoose会用到的一种数据模式,可以理解为表结构的定义:每个schema会映射到mongodb中的一个collection。他不具备操作数据库的能力

一、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);
})
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
6月前
egg.js 24.10sequelize模型-查询单个
egg.js 24.10sequelize模型-查询单个
50 1
egg.js 24.10sequelize模型-查询单个
|
JavaScript NoSQL MongoDB
100 # mongoose 的使用
100 # mongoose 的使用
62 0
|
网络协议 IDE Linux
mongoose使用详细 -- 如何通过mongoose搭建服务器
mongoose使用详细 -- 如何通过mongoose搭建服务器
916 0
|
23天前
|
存储 数据库
mongoose
【10月更文挑战第30天】
24 4
|
2月前
|
JavaScript 前端开发 关系型数据库
使用Sequelize8
使用Sequelize8
25 0
|
5月前
|
JavaScript NoSQL 数据库连接
使用Nodejs + express连接数据库mongoose
【6月更文挑战第3天】这篇文章介绍了如何在Express应用中使用Mongoose连接MongoDB数据库。首先,需要创建一个`db.js`文件,然后通过`npm install mongoose`安装Mongoose驱动。接着,在应用中引入MongoDB模块,建立到数据库的连接。创建一个Mongoose schema定义数据模型,如用户信息表。最后,执行数据库操作,包括查询、插入、更新和删除文档,并在完成后关闭数据库连接。文中还提供了相关代码示例。
198 1
|
6月前
egg.js 24.11sequelize模型-查询多个和获取器
egg.js 24.11sequelize模型-查询多个和获取器
64 0
egg.js 24.11sequelize模型-查询多个和获取器
|
NoSQL JavaScript 关系型数据库
Mongoose-开篇
Mongoose 概述 • Mongoose和MySQL的Sequelize一样, 都是NodeJS中操作数据库的对象模型工具 • Mongoose使用面向对象的思想对原生的mongoDB命令进行了封装
85 0
|
NoSQL MongoDB 数据格式
express+mongoose无限级分类查询(后端)
express+mongoose无限级分类查询(后端)
87 0
|
NoSQL MongoDB
mongoose之bulkWrite
mongoose之bulkWrite
185 0