mongoose是一个ODM(ObjectDataModel)库,也称为对象数据模型。那么为什么它是一个对象数据模型呢?注意:MongoDB或Mongo是NoSQL类型的数据库,也就是说它是非关系型数据库。用于处理数据,实现对象之间的转换。数据处理:创建Schema,并提供Schema的数据校验功能。对象的转换:这些对象是指在开发过程中创建的对象,以及在MongodDB中表示的对应对象。如果你不明白,或者不明白,看了下面的内容,相信你会明白很多。Mongo中的常用术语CollectionsCollections相当于关系型数据库中的表,里面包含了大量的JSON文档(documents)。DocumentsDocuments相当于SQL中的记录(records)或行(rows)。在SQL中,需要多张表通过数据之间的引用来表达数据之间的关系,而在Mongo中,可以通过一个Document来实现。SchemaSQL通过表(table)的定义来定义schema,而MongoDB中则没有。如果我们直接用MongoDB插入,就是一个文档。Mongoose定义了一个模式来表示文档的数据结构或构造函数,它建立在应用程序级别,每个文档都是它的示例对象。FieldsFields或者叫属性,它相当于SQL中的列(columns),它用来构成一个schema。Models和Schema一样也是一种数据结构或者构造器,但是比较特殊。它使用模式来创建一个Document实例,相当于SQL中的一条记录。mongoose中的Schema和Modelmongoose中的schema都是文档构造器,可以用来定义一个文档的默认值和验证字段(fields)。mongoose中的模型提供了访问数据的接口,通过它可以实现文档(也叫记录)的CRUD(增、查、改、删)。因此,可以说模型是Schema的包装器,通过包装实现Schema结构的数据与MongoDB数据库的交互。注意:在开发过程中,使用的都是Model和Schema实例,所以可以理解文章开头提到的对象转换和对象数据模型。有关详细信息,请参阅下面的示例代码。引用mongoose,使用前需要先安装mongooe。可以通过yarninstallmongoose安装,然后使用如下代码引用://Quotemongooseletmongoose=require('mongoose')说明:Schema和Model没有显式连接到数据库。为什么?也就是说,因为在开发过程中,并没有使用mongoose.connect("mongodb://127.0.0.1:27017")返回的对象创建的Schema和Model,而是使用了对mongoose的引用直接地。好处很明显,大大提高了性能。mongoose定义使用了单例设计模式,所以使用require返回一个单例对象,在开发中比较常见,对自己写库有指导意义。连接MongoDB数据库//参考mongooseletmongoose=require('mongoose')//连接demo测试数据库mongoose.connect('mongodb://127.0.0.1:27017/demo')为每个集合中的all定义一个Schema这些文档都使用由相同模式定义的字段。每个文档对象的键名由Schema定义。//引用mongooseletmongoose=require('mongoose')//连接到demo测试数据库mongoose.connect('mongodb://127.0.0.1:27017/demo')//定义并实例化一个SchemaletuserSchema=newmongoose.Schema({firstname:String,lastname:String})也可以对Schema中的字段进行校验,比如:firstname是String类型。Schema的字段值可以是Array、String、Boolean、Buffer、Date、Number、ObjectId或Mixed(通用或可变数据类型)。定义并实例化一个模型//引用mongooseletmongoose=require('mongoose')//连接到demo测试数据库mongoose.connect('mongodb://127.0.0.1:27017/demo')//定义并实例化一个SchemaletUserSchema=newmongoose.Schema({firstname:String,lastname:String})//定义一个ModelletUserModel=mongoose.model('User',userSchema)//实例化一个Modelletperson=newUsermodel({firstname:'Dongpo',lastname:'Su'})有人可能会疑惑为什么Schema的定义和实例化可以放在一起,而Model的定义和实例化要分开呢?因为schema实例不涉及具体的操作,而Model实例往往涉及复杂的操作。所以在开发中往往前者是分两步一起做,后者是分开做。mongoose的CRUD添加数据person.save().then(doc=>{console.log(doc)}).catch(err=>{console.error(err)})查看数据UserModel.find({lastname:'su'//查询}).then(doc=>{console.log(doc)}).catch(err=>{console.error(err)})更新数据UserModel.findOneAndUpdate({lastname:'Su'//query},{firstname:'xxx'//field:values的更新},{new:true,//返回更新后的文档runValidators:true//更新前验证}).then(doc=>{console.log(doc)}).catch(err=>{console.error(err)})删除数据UserModel.findOneAndRemove({firstname:'东坡'}).then(response=>{console.log(response)})。catch(err=>{console.error(err)})当然mongoose也提供了很多有用的API,这里就不赘述了。mongoose查询mongoose系列文章
