Mongoose基础

  • Post author:
  • Post category:其他





一、Mongoose是什么?

是node中提供操作MongoDB的模块。



二、Mongoose的作用

能够通过node语法实现MongoDB数据库的增删改查,从而实现node写程序来管理MongoDB数据库。



三、操作步骤



3.1 引入mongoose模块并建立连接

在建立连接时:useNewUrlParser属性会在url中识别并验证用户用户所需要的数据库,mongodb 4.0版本以前不需要指定,4.0以后的版本一定要指定。

// 引入mongoose
const mongoose = require('mongoose');
// 建立连接
mongoose.connect('mongodb://IP:端口号/test', {useNewUrlParser: true}, () => {
    // 回调函数可以检测连接是否成功
});



3.2 Schema

作用:用来约束MongoDB文档数据(哪些字段是必须的,哪些字段是可选的)。

// 操作users表(集合) 定义一个Schema Schema里面的对象和数据库表里边的字段需要一一对应
// 两种写法,按需选择
var UserSchema = mongoose.Schema({
    name: {
        type: String,
        // 指定默认值
        default: 'w'
    },
    age: Number,
    status: Number
})

var UserSchema = mongoose.Schema({
    name:String,
    age: Number,
    status: Number
})



3.3 model定义数据库模型


第一个参数:

1、首字母要大写。2、要和数据库集合名称对应(默认这个模型会和模型名称相同的复数的数据库集合建立连接)


第二个参数:

定义的Schema名


第三个参数:

映射集合,将user集合映射给User(等同于重命名)

var User = mongoose.model('User', UserSchema, 'user')

var User = mongoose.model('User', UserSchema)


一个模型对应一个集合,通过模型来管理集合中的数据。



3.4 模式修饰符

可以对增加的数据进行一些格式化



mongoose预定义模式修饰符

trim 去掉首尾空格
lowercase 小写字母
uppercase 大写字母
var UserSchema = mongoose.Schema({
    name: {
    	type:String,
    	trim:true//去掉name首尾空格
    },
    age: Number,
    status: Number
})



自定义预定义修饰符

我们可以通过set(建议使用)修饰符在增加数据的时候对数据进行格式化,也可以通过get(不建议使用)在

实例获取数据

(也就是在获取model里的数据)的时候对数据进行格式化。


使用set

var UserSchema = mongoose.Schema({
    name: {
    	type:String,
    	set(parmas){//增加数据的时候对数据进行处理,若name不是以 w 开头就为其头加上 w 
    		if(!parmas){
    			return '';
    		}else{
    			if(parmas.indexOf('w') != 0){
    				return 'w' + parmas;
    			}
    		}
    	}
    }
    age: Number,
    status: Number
})


使用get

var UserSchema = mongoose.Schema({
    name: {
    	type:String,
    	get(parmas){//增加数据的时候对数据进行处理,若name不是以 w 开头就为其头加上 w 
    		if(!parmas){
    			return '';
    		}else{
    			if(parmas.indexOf('w') != 0){
    				return 'w' + parmas;
    			}
    		}
    	}
    }
    age: Number,
    status: Number
})

//若果用get进行格式化,那么在实例化的时候数据就格式化了(就是进行下面的操作的时候),
//执行完后name就变成了‘wli’
var u = new User({
    name: 'li',
    age: 20,
    status: 1
})



3.5 mongoose索引

给数据增加索引的目的是优化查询,但是不建议给无关数据添加索引,因为索引会减慢增加数据的速度。

var UserSchema = mongoose.Schema({
    name: {
    	type:String,
    	unique:true//唯一索引
    },
    age: {
    	type:String,
    	index:true//普通	索引
    },
    status: Number
})



3.6 数据校验

require 表示这个数据不能为空
max 用于Number类型数据,最大值
min 用于Number类型数据,最小值
enum 枚举类型,要求数据必须瞒住枚举值 (用在string类型) enum:[‘0’,‘1’]
match 增加的数据必须符合match(正则,用在string)的规则
maxlength 最大值(用在string类型)
minlength 最小值(用在string类型)
var UserSchema = mongoose.Schema({
    name: {
    	type:String,
    	require:true//实例化的时候必需要有数据
    },
    age: String,
    status: Number
})



自定义数据校验

var UserSchema = mongoose.Schema({
    name: {
    	type:String,
    	//自定义name长度要大于10
    	validate:(ob) => {
    		return ob.length >= 10;
    	}
    },
    age: String,
    status: Number
})



3.7 增删改查

//增加数据首先要定义一个数据实例
var u = new User({
    name: 'li',
    age: 20,
    status: 1
})
//增加
u.save((err, doc) => {
    // 回调函数
})

//查询
User.find({/*查询条件 */}, (err, doc) => {
    // 回调函数
})

// 数据更新一条数据
User.updateOne({ "name": "li"/*条件*/ }, { "age": 24/*要修改的新值 */ }, (err, doc) => {
    // 回调函数
})

//删除一条数据
User.deleteOne({ "name": "li"/*条件*/ }, (err, doc) => {
    // 回调函数
})



3.8 自定义方法



自定义静态方法

UserSchema.static.findByName = (name, cb){
	this.find('name':name, (err, docs){
		//cb是回调函数
		cb(err, docs);
	})
}



自定义实例方法(基本不用)

实例方法只能在实例化model以后才能使用

UserSchema.methods.print = () => {
	cosole.log('实例方法');
}



3.9 mongoose聚合管道

使用聚合管道可以对集合中的文档进行变换和组合。 实际项目:表关联查询、数据的统计。


两表关联查询举例:

orderModel.aggregate([
    {
        $lookup: {
            from: "order_item",//关联的表
            localField: "order_id",//关联的条件
            foreignField: "order_id",//关联的条件
            as: "items"//查询到的数据放到items里边
        }
    }
], (err, docs) => {
    // 回调函数
})


多表关联查询举例

orderModel.aggregate([
    {
        $lookup: {
            from: "order_item",//关联的表
            localField: "order_id",//关联的条件
            foreignField: "order_id",//关联的条件
            as: "items"//查询到的数据放到items里边
        },
        $lookup: {
            from: "auth_item",//关联的表
            localField: "auth_id",//关联的条件
            foreignField: "order_id",//关联的条件
            as: "auth"//查询到的数据放到auth里边
        }
    }
], (err, docs) => {
    // 回调函数
})



3.10 数据库的导出和导入



导出

mongodump -h dbhost -d dbname -o dbdirectory

-h:ip地址

-d:导出的数据库名

-o:到处的位置(路径)



导入

mongorestore -h dbhost -d dbname <path>



四、接口



4.1 接口是什么?


接口就是一个文件(js/jsp/php等),主要响应JSON数据(操作方便,体积小)或XML数据。

//推荐JSON数据格式
{
	meta: {
		msg: 提示信息,
		status: 状态码(200/201/301/302/400/401/403/404/500)
	},
	data: 数据
}



4.2 作用

数据角度:让我们的项目静态/固定数据动态(也就是让数据来源于数据库)。

功能角度:短信提示、天气接口等。



关于Mongoos的其它操作可以查看官方文档

点这里

,兄弟们,加油啊!!!



版权声明:本文为weixin_46015333原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。