mongoose

http://www.imooc.com/learn/197

简介

MongoDB

MongoDB是基于文档的非关系型数据库(文档型数据库),文档是按BSON(JSON的轻量化二进制格式)存储的。

MongoDB数据逻辑结构

  1. 文档(document):键值对,相当于行。
  2. 集合(collection):相当于表。多个文档组成一个集合。
  3. 数据库(database):多个集合组成数据库。

关系型数据库,表结构是固定的,比如某一行由若干列组成,行行都一样,而MongoDB,一个集合里的多个文档可以有不同的结构,更灵活一些。

Mongoose

mongoose 是个 odm(Object-Document Mapping)。odm 对应 sql 中的 orm(Object-Relational Mapping)。

Mongoose组成

1. Schema
a)创建表

类似create table创建表。
类型有:字符串、日期型、数值型、布尔型(Boolean)、null、数组、内嵌文档等

var mongoose = require('mongoose')
var Schema = mongoose.Schema
var ObjectId = Schema.Types.ObjectId

var CategorySchema = new Schema({
  name: String,
  movies: [{type: ObjectId, ref: 'Movie', unique: true}],
  meta: {
    createAt: {
      type: Date,
      default: Date.now()
    }
  }
})
b)构造函数
// 添加 mongoose 实例方法
CategorySchema.methods = {}
// 添加 mongoose 静态方法,静态方法在Model层就能使用
CategorySchema.statics = {
  fetch: function(cb) {
    return this
      .find({})
      .sort('meta.updateAt')
      .exec(cb)
  },
  findById: function(id, cb) {
    return this
      .findOne({_id: id})
      .exec(cb)
  }
}
CategorySchema.pre('save', function(next) {
  if (this.isNew) {
    this.meta.createAt = this.meta.updateAt = Date.now()
  }
  else {
    this.meta.updateAt = Date.now()
  }

  next()
})
2. Model

由Schema构造生成的模型,表。
对模型进行编译,生成构造函数。

var mongoose = require('mongoose')
var CategorySchema = require('../schemas/category')
var Category = mongoose.model('Category', CategorySchema)

module.exports = Category
3. Entity

由Model创建的实体,使用save方法保存数据。数据。

  var mongoose = require('mongoose')
  var Category = mongoose.model('Category')
  var _category = req.body.category
  var category = new Category(_category)
  category.save(function(err, category) {
  })
  // 调用2中静态方法
  Category.fetch(function(err, catetories) {
  })

方法

connect

mongoose.connect('mongodb://localhost/XX', function (err){});

Population

因为MongoDB是文档型数据库,所以它没有关系型数据库joins(数据库的两张表通过”外键”,建立连接关系。) 特性。

使用Population可以实现在一个 document 中填充其他 collection(s) 的 document(s)。

在定义Schema的时候,如果设置某个 field 关联另一个Schema,那么在获取 document 的时候就可以使用 Population 功能通过关联Schema的 field 找到关联的另一个 document,并且用被关联 document 的内容替换掉原来关联字段(field)的内容。

Query#populate

Query.populate(path, [select], [model], [match], [options])
// select类型:Object或String,可选,指定填充 document 中的哪些字段。
// options类型:Object,可选,指定附加的其他查询选项,如排序以及条数限制等等。
  Category
    .find({})
    .populate({
      path: 'movies',
      select: 'title poster',
      options: { limit: 6 }
    })
    .exec(function(err, categories) {})

Model#update

Movie.update({_id: id}, {$inc: {pv: 1}}, function(err) {})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值