Mongoose

一,简介

mongoose是Node中的一个模块

  • 之前我们都是通过shell来完成对数据库的各种操作的,在开发中大部分时候我们都需要通过程序来完成对数据库的操作。通过mongoose可以让我们使用node来对MongoDB数据库进行各种操作。
  • Mongoose是一个对象文档模型(ODM)库,它对Node原生的MongoDB模块进行了进一步的优化封装,并提供了更多的功能。mongoose将数据库中的文档和node中的对象做了一个映射,  通过对象的操作就可以影响到数据库中的文档

二,mongoose的好处

  • 可以为文档创建一个模式结构(Schema)
  • 可以对模型中的对象/文档进行验证 数据可以通过类型转换转换为对象模型
  • 可以使用中间件来应用业务逻辑挂钩 比Node原生的MongoDB驱动更容易

三、mongoose中的对象

Schema(模式对象) :Schema对象定义约束了数据库中的文档结构 ,简单来说,模式就是对文档的约束,有了模式,文档中的字段必须符合模式的规定。否则将不能正常操作.(集合中有哪些字段、字段是什么类型、字段是否是必须的)

Model :Model对象作为集合中的所有文档的表示,相当于MongoDB数据库中的集合collection,通过Model可以对数据库的集合进行各种操作

Document :Document表示集合中的具体文档,相当于集合中的一个具体的文档。Document就相当于数据库中的文档,通过Document可以用来对文档进行各种操作,Document是Model的实例

四、使用mongoose

1 连接mongoDB数据库

/*
	1.下载安装Mongoose
		npm i mongoose --save
	2.在项目中引入mongoose
		var mongoose = require("mongoose");
	3.连接MongoDB数据库
 		mongoose.connect('mongodb://数据库的ip地址:端口号/数据库名', { useMongoClient: true});
 		- 如果端口号是默认端口号(27017) 则可以省略不写

 	4.断开数据库连接(一般不需要调用)
 		- MongoDB数据库,一般情况下,只需要连接一次,连接一次以后,除非项目停止服务器关闭,否则连接一般不会断开
 			mongoose.disconnect()

	- 监听MongoDB数据库的连接状态
		- 在mongoose对象中,有一个属性叫做connection,该对象表示的就是数据库连接
			通过监视该对象的状态,可以来监听数据库的连接与断开

		数据库连接成功的事件
		mongoose.connection.once("open",function(){});

		数据库断开的事件
		mongoose.connection.once("close",function(){});

		Schema
		Model
		Document

 */

//引入
var mongoose = require("mongoose");
//连接数据库
mongoose.connect("mongodb://127.0.0.1/mongoose_test" , { useMongoClient: true});

mongoose.connection.once("open",function(){
	console.log("数据库连接成功~~~");
});

mongoose.connection.once("close",function(){
	console.log("数据库连接已经断开~~~");
});

//断开数据库连接
mongoose.disconnect();

连接成功数据库后,要创建模式(schema);

模式为集合中的文档定义字段和字段类型。

模式需要通过mongoose的Schema属性来创建,这个属性是一个构造函数。

new Schema(definition,option) ;

-definition(描述模式) ;

-options 配置对象,定义与数据库中集合的交互;

//将mongoose.Schema 赋值给一个变量
var Schema = mongoose.Schema;

//创建Schema(模式)对象
var stuSchema = new Schema({

    name:String,
    age:Number,
    gender:{
        type:String,
        default:"female"
    },
    address:String

});

// 模式创建完后,创建Model

//通过Schema来创建Model
//Model代表的是数据库中的集合,通过Model才能对数据库进行操作
//mongoose.model(modelName, schema):
//modelName 就是要映射的集合名 mongoose会自动将集合名变成复数
var StuModel = mongoose.model("student" , stuSchema);

有了Model就可以操作数据库了

 

2 操作数据库

 插入文档

var mongoose = require("mongoose");
mongoose.connect("mongodb://127.0.0.1/mongoose_test",{useMongoClient:true});
mongoose.connection.once("open",function () {
	console.log("数据库连接成功~~~");
});


//将mongoose.Schema 赋值给一个变量
var Schema = mongoose.Schema;

//创建Schema(模式)对象
var stuSchema = new Schema({

	name:String,
	age:Number,
	gender:{
		type:String,
		default:"female"
	},
	address:String

});

//通过Schema来创建Model
//Model代表的是数据库中的集合,通过Model才能对数据库进行操作
//mongoose.model(modelName, schema):
//modelName 就是要映射的集合名 mongoose会自动将集合名变成复数
var StuModel = mongoose.model("student" , stuSchema);

//向数据库中插入一个文档
//StuModel.create(doc, function(err){});
StuModel.create({
	name:"白骨精",
	age:16,
	address:"白骨洞"
},function (err) {
	if(!err){
		console.log("插入成功~~~");
	}
});

CRUD操作: 

var mongoose = require("mongoose");
mongoose.connect("mongodb://127.0.0.1/mongoose_test",{useMongoClient:true});
mongoose.connection.once("open",function () {
	console.log("数据库连接成功~~~");
});

var Schema = mongoose.Schema;

var stuSchema = new Schema({

	name:String,
	age:Number,
	gender:{
		type:String,
		default:"female"
	},
	address:String

});

var StuModel = mongoose.model("student" , stuSchema);
/*
	- 有了Model,我们就可以来对数据库进行增删改查的操作了

 	Model.create(doc(s), [callback])
 	- 用来创建一个或多个文档并添加到数据库中
 	- 参数:
 		doc(s) 可以是一个文档对象,也可以是一个文档对象的数组
 		callback 当操作完成以后调用的回调函数

 	查询的:
	 Model.find(conditions, [projection], [options], [callback])
	 	- 查询所有符合条件的文档 总会返回一个数组
	 Model.findById(id, [projection], [options], [callback])
	 	- 根据文档的id属性查询文档
	 Model.findOne([conditions], [projection], [options], [callback])
	 	- 查询符合条件的第一个文档 总和返回一个具体的文档对象

 		conditions 查询的条件
 		projection 投影 需要获取到的字段
 			- 两种方式
 				{name:1,_id:0}
 				"name -_id"
 		options  查询选项(skip limit)
 				{skip:3 , limit:1}
 		callback 回调函数,查询结果会通过回调函数返回
 					回调函数必须传,如果不传回调函数,压根不会查询

 */

/*StuModel.find({name:"唐僧"},function (err , docs) {
	if(!err){
		console.log(docs);
	}
});*/

/*StuModel.find({},{name:1 , _id:0},function (err , docs) {
	if(!err){
		console.log(docs);
	}
});*/

/*StuModel.find({},"name age -_id", {skip:3 , limit:1} , function (err , docs) {
	if(!err){
		console.log(docs);
	}
});*/

/*StuModel.findOne({} , function (err , doc) {
	if(!err){
		console.log(doc);
	}
});*/

/*StuModel.findById("59c4c3cf4e5483191467d392" , function (err , doc) {
	if(!err){
		//console.log(doc);
		//通过find()查询的结果,返回的对象,就是Document,文档对象
		//Document对象是Model的实例
		console.log(doc instanceof StuModel);
	}
});*/



/*StuModel.create([
	{
		name:"沙和尚",
		age:38,
		gender:"male",
		address:"流沙河"
	}

],function (err) {
	if(!err){
		console.log(arguments);
	}
});*/


/*
	修改
 Model.update(conditions, doc, [options], [callback])
 Model.updateMany(conditions, doc, [options], [callback])
 Model.updateOne(conditions, doc, [options], [callback])
 	- 用来修改一个或多个文档
 	- 参数:
 		conditions 查询条件
 		doc 修改后的对象
 		options 配置参数
 		callback 回调函数
 Model.replaceOne(conditions, doc, [options], [callback])
* */

//修改唐僧的年龄为20
/*StuModel.updateOne({name:"唐僧"},{$set:{age:20}},function (err) {
	if(!err){
		console.log("修改成功");
	}
});*/

/*
	删除:
 Model.remove(conditions, [callback])
 Model.deleteOne(conditions, [callback])
 Model.deleteMany(conditions, [callback])
 */
/*StuModel.remove({name:"白骨精"},function (err) {
	if(!err){
		console.log("删除成功~~");
	}
});*/

/*
 Model.count(conditions, [callback])
 	- 统计文档的数量的
 */
StuModel.count({},function (err , count) {
	if(!err){
		console.log(count);
	}
});

3.用Document对象操作数据库

let mongoose=require('mongoose');
mongoose.connect('mongodb://127.0.0.1:27017/mongoose',{ useNewUrlParser: true });
mongoose.connection.once('open',function () {
    console.log("连接成功");
});

let Schema=mongoose.Schema;
let stuShema=new Schema({
    name:String,
    age:Number,
    sex:{
        type:String,
        default:"female"
    },
    address:String
});
let stuModel=mongoose.model("student",stuShema);
/*
	Document 和 集合中的文档一一对应 , Document是Model的实例
		通过Model查询到结果都是Document
 */

// 创建一个Document对象
/*let stuDoc=new stuModel({
    name:"沙僧",
    age:39,
    sex:"male",
    address:"流沙河"
});*/
// document的方法
/*stuDoc.save(function (err) {
    if (!err){
        console.log("插入了");
    }

});*/
stuModel.findOne({name:"孙悟空"},function (err,doc) {
    if(!err){
        console.log("前:"+doc);
        // doc 是查询出来的Document对象,所以可以使用Document对象的方法
        doc.update({age:77},function (err) {
            if (!err){
                console.log("修改成功!");
            }
        });
        // 直接Document.属性=值,需要save()方法保存;
        doc.age=88;
        doc.save();
        //删除
        doc.remove(function (err) {
            if (!err){
                console.log("再见");
            }

        });
        
        
    }
    
});

/*stuModel.create({
    name:"猪八戒",
    age:19,
    sex:"male",
    address:"高老庄"
},function (err) {
    if (!err){
        console.log("插入成功!");
    }

});*/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值