- 可以为文档创建一个模式结构 (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) }) 复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Introduction to Computer Science Using Python
Dierbach, Charles / 2012-12 / $ 133.62
Introduction to Computer Science Using Python: A Computational Problem-Solving Focus introduces students to programming and computational problem-solving via a back-to-basics, step-by-step, objects-la......一起来看看 《Introduction to Computer Science Using Python》 这本书的介绍吧!