Mongoose基础


一、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的其它操作可以查看官方文档点这里,兄弟们,加油啊!!!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mongoose中,create方法用于创建新的文档。通过定义一个Mongoose模型,可以使用create方法来创建一个新的文档。例如,可以使用如下代码创建一个名为User的模型,并使用create方法创建一个名为doc的新文档,其中文档中的name字段为'O.O': ```javascript const User = mongoose.model('User', mongoose.Schema({ name: String })) const doc = await User.create({ name: 'O.O' }) console.log(doc instanceof User) // true console.log(doc.name) // 'O.O' ``` 以上代码中,首先定义了一个名为User的模型,该模型具有一个name字段,然后通过create方法创建了一个新的文档,并将其赋给了名为doc的变量。最后,我们可以通过doc.name来获取新文档中的name字段的值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Mongoose基础入门](https://blog.csdn.net/u010142437/article/details/79218145)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Mongoose create() 方法](https://blog.csdn.net/weixin_46267040/article/details/125369782)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值