一篇文章入门Mongoose

1,536 阅读4分钟

Mongoose入门

01 mongoose的好处

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

02 mongoose中的新对象

  • Schema(模式对象)
    • Schema对象定义约束了数据库中的文档结构
  • Model
    • Model对象作为集合中的所有文档的表示,相当于MongoDB数据库中的集合collection
  • Document
    • Document表示集合中的具体文档,相当于集合中的一个具体的文档

03实例

/*
1.下载安装mongoose
npm i mongoose --save
2.引入数据库
var mongoose = require("mongoose");
3.连接数据库
mongoose.connect("mongodb://localhost/test",{useMongoClient:true});
mongoose.connect("mongodb://数据库的ip:端口号/数据库名",{useMongoClient:true})
新版中{useMongoClient:true}不用再写了
端口号默认是27017则可以省略
4.监听数据库连接状态

	在mongoose对象中,有一个属性是connection,该对象表示的就是数据库连接
	通过监视该对象的状态,可以来监听数据库的连接与断开
	
	数据库连接成功的事件
	
	mongoose.connection.once("open",fn);
	
	数据库断开的事件
	
	mongoose.connection.once("close",fn);
	
5.断开数据库连接
	mongoose.disconnect();
*/

04 Schema

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

//创建约束模式

//将mongooose.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 就是要映射的集合名
var stuModel = mongoose.model("students",stuSchema);

//创建文档
// stuModel.create(doc,fn(err){})
stuModel.create({
    name:"胡志武",
    age:21,
    address:"广州"
},function(err){
    if(!err){
        console.log("创建文档成功")
    }
})

05 Model

有了Model,我们就可以来对数据库进行增删改查的操作了

  • Model.create(doc(s),[callback])
    • 用来创建一个文档或多个文档并添加到数据库中
    • 参数
      • doc(s)可以是一个文档对象,也可以是一个文档对象的数组
      • callback

查询

  • Model.find(conditions,[projection],[options],[callback])

    • 查询符合条件的文档
    • 总会返回一个数组
  • Model.findOne([conditions],[projection],[options],[callback])

    • 查询符合条件的第一个文档
    • 返回第一个具体的文档对象
  • Model.findById(id,[projection],[options],[callback])

    • 根据文档的id属性查询文档

    conditions 查询的条件

    projection 投影 需要获取的字段,

    • 两种方式:
      • {name:1,id:0}
      • "name -id"

    options 查询选项(skip limit)

    callback 回调函数,查询结果会通过回调函数返回

stuModel.find({name:"胡志武"},function(err,docs){
    if(!err){
		console.log(docs);
    }
})
stuModel.find({},"name -id",function(err,docs){
    if(!err){
        console.log(docs);
    }
})
stuModel.find({},"name -id",{skip:3},function(err,docs){
    if(!err){
        console.log(docs);
    }
})

修改

Model.update(conditions,doc,[options],[callback])

Model.updateOne(conditions,doc,[options],[callback])

Model.updateMany(conditions,doc,[options],[callback])

  • 用来修改一个或多个文档
  • 参数
    • conditions 查询条件
    • doc 修改后的对象
    • options 配置参数
    • callback 回调函数
stuModel.update({name:"胡志武"},{$set:{age:20}},function(err){
    if(!err){
        console.log("修改成功");
    }
})

删除

Model.remove(conditions,[callback]);

Model.deleteOne(conditions,[callback]);

Model.delete(conditions,[callback]);

Model.remove({name:"胡志武"},function(err){
    console.log("删除成功!");
})

文档的数量

Model.count(conditions,[callback])

stuModel.count({age:18},function(err,count){
    console.log(count);
})

06 Document

Document 和 集合中的文档一一对应,Document是Model的实例

通过Model查询到结果都是Document

创建一个Document

var stu = new StuModel({
    name:"奔波霸",
    age:48,
    gender:"male",
    address"碧波谭"
})
//	此时还没有插入数据库中

/*
	document的方法
		Model#save([option],[callback])
	 
*/
stu.save(function(err){
    console.log("保存成功")
})
/*
	doc.update(update,[options],[callback] )
		-	修改对象
	doc.remove([callback])
		-	删除文档
		
	doc.get(name)===doc[name]
    doc.set(name,value)===doc[name]=value
    doc._id
    doc.toObject   转化为JS对象
    转化为js对象才能删除其中一个属性
    但转化后document的方法都不能使用了
*/

07 Mongoose关联表的操作

分两步走:

1.建立约束模型式,指定关联字段

var mongoose = require("mongoose")
var Schema = mongoose.Schema;
var article = new Schema({
      //关联字段 - 内容分类的id
    category: {
        //类型
        type: mongoose.Schema.Types.ObjectId,
        //引用
        ref: 'Category'//数据库中集合的名字
    },
})

ref表示要关联的集合名字,type表示通过ObjectId关联该集合

2.关联查询表时,使用populate

Query.populate(path, [select], [model], [match],[options])

path:你要查询的集合名

model:类型Model,指定要关联字段的model,没有指定的话,就会使用ref指定的

match:查询条件

options:查询参数,如limit,skip等

实例

content.findOne()
    .populate({path:['user','catagory']})
    .exec(function(err,data){
    
})

08Mongoose支持Promise,避免回调地狱

content.find()
		.count()
    	.then(function(data){
		return content.find().skip(data/2).limit(10)
	}).then(function(data){
		console.log(data)
	})

结语

如有错漏处,还请看官们多多指正,如果觉得这篇文章对你有帮助的话,欢迎点赞分享!

如果要转载,请注明出处

本文作者:胡志武

时间:2019/5/29