mongoose 再认识(一)

mongoose 是一个ODM(Object Data Model)的库,也叫作对象数据模型。那么为何说是对象数据模型呢?html

注:MongoDB或者Mongo是NoSQL类型的数据库,也就是说是非关系型的数据库。node

它被用来处理数据,实现对象间的转换。git

  • 数据处理:建立一个Schema,提供Schema的数据验证功能。
  • 对象的转换:这些对象是指开发过程当中建立的对象和MongodDB中表明的相应对象。

若是不明白,或者似懂非懂,若是看了下文,相信你会明白很多。github

经常使用的术语

Collections

Mongo中的Collections至关于关系数据库中的表(tables),它包含了大量的JSON文档(document)。mongodb

Documents

Documents至关于SQL中的记录(records)或者(rows)。在SQL中须要用多个表,经过数据间的引用来表达数据间的关联,可是在Mongo中能够经过一个Document来实现。数据库

NoSQL的Documents VS SQL 中的关联Tables

Schema

SQL定义一个schema经过表(table)的定义,而MongoDB中是没有这个的,若是咱们使用MongoDB直接插入的就是一个document。mongoose它定义了一个schema来表示document 的数据结构或者构造函数,它是创建在应用层面上的,每一个docuemnt都是它的示例对象。设计模式

Fields

Fields 或者称之为属性,它至关于SQL中的(columns),它用来造成一个个schemaapi

Models

Schema同样它也是一个数据结构或者构造函数,不过它更特殊。它使用schema建立了一个Document的实例,这个实例至关于SQL中的记录(record)。数据结构

mongoose中的 Schema 和 Model

mongoose中的schemadocument的构造函数,使用它能够定义一个document的默认值,进行字段(fields)的验证。mongoose

mongoose中的model提供了一个访问数据的接口,经过它能够实现对document(也能够叫作记录)的CRUD(增,查,改,删)。

因此,能够这么说modelSchema的包装器,经过包装实现了Schema结构的数据与MongoDB数据库之间的交互。

注:在开发过程当中,使用的都是ModelSchema的实例,因此能够理解文章开篇说的对象转换对象数据模型。具体可参考下面的示例代码。

引用mongoose

使用前须要先安装mongooe,可经过yarn install mongoose来安装,而后经过以下代码来引用:

// 引用mongoose
let mongoose = require('mongoose')

说明:SchemaModel不是显式的链接到了数据库,为何这么说呢,由于开发的过程当中,不是使用的mongoose.connect("mongodb://127.0.0.1:27017")返回的对象建立的SchemaModel,而是直接使用的mongoose的引用,这样作的好处很明显,极大地提高了性能。

mongoose定义使用了单例设计模式,因此使用require返回了一个单例对象,这在开发中比较常见,对于写本身的库有指导意义。

链接到MongoDB数据库

// 引用mongoose
let mongoose = require('mongoose')
// 链接到demo测试数据库
mongoose.connect('mongodb://127.0.0.1:27017/demo')

定义一个Schema

每个collection中的全部document都使用同一个Schema定义的field。每个document对象的键名经过Schema来定义。

// 引用mongoose
let mongoose = require('mongoose')
// 链接到demo测试数据库
mongoose.connect('mongodb://127.0.0.1:27017/demo')
// 定义并实例化一个Schema
let userSchema = new mongoose.Schema({
  firstname: String,
  lastname: String
})

一样在Schema中能够对field进行验证,如:firstnameString类型的。

Schema的字段值能够是Array,String,Boolean,Buffer,Date,Number,ObjectId,或者Mixed(泛型,或者一个可变化的数据类型)。

定义并实例化一个model

// 引用mongoose
let mongoose = require('mongoose')
// 链接到demo测试数据库
mongoose.connect('mongodb://127.0.0.1:27017/demo')
// 定义并实例化一个Schema
let UserSchema = new mongoose.Schema({
  firstname: String,
  lastname: String
})
// 定义一个Model
let UserModel = mongoose.model('User', userSchema)
// 实例化一个Model
let person = new Usermodel({
  firstname: '东坡',
  lastname: '苏'
})

可能有的人会比较疑惑,为何Schema的定义和实例化能够放在一块儿,而Model的定义和实例化要分开?由于schema的实例不牵涉到具体的操做,而Model的实例每每牵涉到复杂的操做。因此前者在开发中每每两个步骤一块儿来作,后者分开来作。

mongoose的CRUD

添加数据

person
  .save()
  .then(doc => {
    console.log(doc)
  })
  .catch(err => {
    console.error(err)
  })

查看数据

UserModel
  .find({
    lastname: '苏'   // query
  })
  .then(doc => {
    console.log(doc)
  })
  .catch(err => {
    console.error(err)
  })

更新数据

UserModel
  .findOneAndUpdate(
    {
      lasttname: '苏'  // query
    }, 
    {
      firstname: 'xxx'   // field:values 的更新
    },
    {
      new: true,                       // 返回更新后的document
      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 queries

mongoose系列文章

相关文章
相关标签/搜索