mongoose

1. 什么是 mongoose

  • Mongoose 是在 node.js 环境下对 mongodb 进行便捷操作的对象模型工具

2. 安装

  • 依赖 nodejs 和 mongodb
  • npm install mongoose –save
  • require(‘mongoose’)

3. connect 用于创建数据库连接

  • mongoose.connect(url(s), [options], [callback])
    • //url(s):数据库地址,可以是多个,以,隔开
    • //options:可选,配置参数
    • //callback:可选,回调
  • mongoose.connect(‘mongodb://用户名:密码@127.0.0.1:27017/数据库名称’)
  • 连接多个 mongoose.connect(‘urlA,urlB,…’, {mongos : true })
  • mongoose.disconnect() 断开连接

4. Schema–Each schema maps to a MongoDB collection and defines the shape of the documents within that collection.

  • 主要用于定义 MongoDB 中集合 Collection 里文档 document 的结构,
  • 可以理解为 mongoose 对表结构的定义
  • (不仅仅可以定义文档的结构和属性,还可以定义文档的实例方法、静态模型方法、复合索引等),
  • 每个 schema 会映射到 mongodb 中的一个 collection,
  • schema 不具备操作数据库的能力
  • String 字符串 Number 数字 Date 日期 Buffer 二进制 Boolean 布尔值 Mixed 混合类型 ObjectId 对象 ID Array 数组
  • 如果需要在 Schema 定义后添加其他字段,可以使用 add()方法

5. Model–Models are fancy constructors compiled from Schema definitions. An instance of a model is called a document.

  • 是由 Schema 编译而成的假想(fancy)构造器,具有抽象属性和行为。
  • Model 的每一个实例(instance)就是一个 document,document 可以保存到数据库和对数据库进行操作。
  • 简单说就是 model 是由 schema 生成的模型,可以对数据库的操作。
  • 实例化文档 document,通过对原型 Model 使用 new 方法,实例化出文档 document 对象
  • 文档保存。必须通过 save()方法,才能将创建的文档保存到数据库的集合中
  • 实例方法和静态方法.区别在于,静态方法是给 model 添加方法,实例方法是给 document 添加方法
  • Mongoose 会将集合名称设置为模型名称的小写版。如果名称的最后一个字符是字母,则会变成复数;如果名称的最后一个字符是数字,则不变

6. Documents–Each document is an instance of its Model.

7. 文档新增

  • 实例化 model,然后 save()
  • 使用模型 model 的 create()方法,Model.create(doc(s), [callback])
  • 最后一种是模型 model 的 insertMany()方法,Model.insertMany(doc(s), [options], [callback])

8. 文档查询

  • find()
    • 第一个参数表示查询条件,第二个参数用于控制返回的字段,第三个参数用于配置查询参数,第四个参数是回调函数
    • Model.find(conditions, [projection], [options], [callback])
  • findById()
    • Model.findById(id, [projection], [options], [callback])
  • findOne()
    • 该方法返回查找到的所有实例的第一个
  • 文档查询中,常用的查询条件如下 (Query and Projection Operators)
    • $or     或关系
    • $nor     或关系取反
    • $gt     大于
    • $gte     大于等于
    • $lt     小于
    • $lte     小于等于
    • $ne     不等于
    • $in     在多个值范围内
    • $nin     不在多个值范围内
    • $all     匹配数组中多个值
    • $regex    正则,用于模糊查询
    • $size    匹配数组大小
    • $maxDistance  范围查询,距离(基于 LBS)
    • $mod     取模运算
    • $near     邻域查询,查询附近的位置(基于 LBS)
    • $exists    字段是否存在
    • $elemMatch  匹配内数组内的元素
    • $within    范围查询(基于 LBS)
    • $box      范围查询,矩形范围(基于 LBS)
    • $center    范围醒询,圆形范围(基于 LBS)
    • $centerSphere  范围查询,球形范围(基于 LBS)
    • $slice     查询字段集合中的元素(比如从第几个之后,第 N 到第 M 个元素

9. 文档更新

  • Model.update(conditions, doc, [options], [callback])
    • 第一个参数 conditions 为查询条件,第二个参数 doc 为需要修改的数据,第三个参数 options 为控制选项,第四个参数是回调函数
    • options 有如下选项
      • safe (boolean): 默认为 true。安全模式。
      • upsert (boolean): 默认为 false。如果不存在则创建新记录。
      • multi (boolean): 默认为 false。是否更新多个查询记录。
      • runValidators: 如果值为 true,执行 Validation 验证。
      • setDefaultsOnInsert: 如果 upsert 选项为 true,在新建时插入文档定义的默认值。
      • strict (boolean): 以 strict 模式进行更新。
      • overwrite (boolean): 默认为 false。禁用 update-only 模式,允许覆盖记录。
  • updateMany()与 update()方法唯一的区别就是默认更新多个文档,即使设置{multi:false}也无法只更新第一个文档
  • 如果需要更新的操作比较复杂,可以使用 find()+save()方法来处理
  • updateOne()方法只能更新找到的第一条数据,即使设置{multi:true}也无法同时更新多个文档
  • findOne() + save()
  • Model.findOneAndUpdate([conditions], [update], [options], [callback])
  • Model.findByIdAndUpdate([conditions], [update], [options], [callback])
  • 操作符 Update Operators

10. 文档删除

  • remove
    • model.remove(conditions, [callback])
    • document.remove([callback])
  • Model.findOneAndRemove(conditions, [options], [callback])
  • Model.findByIdAndRemove(id, [options], [callback])

11. 查询后处理

  • sort 排序 按某字段排序
  • skip 跳过 做任何操作前跳过若干
  • limit 限制 规定最大返回数量
  • select 显示字段 规定显示的字段
  • count 计数 计数查询结果
  • distinct 去重 统计某字段值的情况
  • exect 执行 执行最终查询

12. 文档验证

  • Validation is defined in the SchemaType 定义在 schema 中
  • Validation is middleware. Mongoose registers validation as a pre(‘save’) hook on every schema by default.中间件,默认注册了 pre(‘save’) 钩子
  • You can manually run validation using doc.validate(callback) or doc.validateSync() 可手动运行
  • Validators are not run on undefined values. The only exception is the required validator. 未定义值不会校验
  • Validation is asynchronously recursive; when you call Model#save, sub-document validation is executed as well. If an error occurs, your Model#save callback receives it 嵌套异步执行
  • Validation is customizable 自定义
  • 规则
    • required: 数据必须填写
    • default: 默认值
    • validate: 自定义匹配
    • min: 最小值(只适用于数字)
    • max: 最大值(只适用于数字)
    • match: 正则匹配(只适用于字符串)
    • enum: 枚举匹配(只适用于字符串)