http://www.imooc.com/learn/197
简介
MongoDB
MongoDB是基于文档的非关系型数据库(文档型数据库),文档是按BSON(JSON的轻量化二进制格式)存储的。
MongoDB数据逻辑结构
- 文档(document):键值对,相当于行。
- 集合(collection):相当于表。多个文档组成一个集合。
- 数据库(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) {})