您现在的位置:首页 >> 前端 >> 内容

Mongoose学习笔记

时间:2017/6/16 9:20:35 点击:

  核心提示:Mongoose学习笔记重点记录基本操作 (详见 #a2)var Promise = require(bluebird)var mongoose = Promise.promisifyAll(requ...

Mongoose学习笔记
重点记录

基本操作 (详见 #a2)

var Promise = require('bluebird')
var mongoose = Promise.promisifyAll(require('mongoose'))// (详见 #b2)

// 连接数据库
mongoose.connect('127.0.0.1:27017/foobar')
mongoose.Promise = Promise// (详见 #b1)

var Schema = mongoose.Schema

// 定义 Schema
var blogSchema = new Schema({
    index: Number,
    sex: String,
})

// 编译 model
var Blog = mongoose.model('Blog', blogSchema)

// 新建虚拟属性(不保存到数据库)
var blog = new Blog({
    index: 100,
})
// 保存到数据库
blog.saveAsync().then(function(data) {
    console.log(data)
})

// 直接新建(保存到数据库)
Blog.createAsync({index: 200}).then(function(data) {
    console.log(data)
})

// 查找
Blog.find({index: 0}, function(err, data) {
    console.log(err)
    for(var i=0; i

自定义验证

...
var Schema = mongoose.Schema

// 定义 Schema
var blogSchema = new Schema({
    index: {
        type: Number,
        min: [5, '太小了'],// 最小值
        max: 10,// 最大值
    },
    age: {
        type: {},// 使用自定义验证时,这里最好使用{}(这样可以去掉原来的类型验证)
        validate: {
            validator: function(value) {// 自定义验证
                return /^\d{2}$/.test(value)
            },
            message: '{VALUE}只能是两位数',
        },
        required: [true, '必须填入此项'],// 必须值和错误信息
    },
    sex: {
        type: String,
        required: true,// 必须值
        enum: {
            values: ['male', 'female'],// 枚举值
            message: '{PATH}的值不能是{VALUE}',// 自定义错误提示 {PATH}-当前被验证键 {VALUE}-已经被确定是错误的值
        },
    },
    date: Date,
})


// 新建时将自动对数据进行验证
Blog.create({index: 5, sex: 'male', age: 12}, function(err, data) {
    if(err) console.log(err.message)
    console.log(data)
})

// 更新时默认是不验证的
Blog.update({age: 12}, {sex: 'female2'}, {runValidators: true}, function(err, data) {// runValidators-true 开启验证
    if(err) console.log(err.message, 1)
    console.log(data, 2)
})

方法 Promise 化 (详见 #b1)

var Promise = require('bluebird')
var mongoose = Promise.promisifyAll(require('mongoose'))

...
Blog.findAsync({index: 0}).then(function(data) {
    console.log(data)
}).catch(function(err) {
    console.log(err)
})

数据库时间格式化

数据库默认存储的时间格式,如:ISODate("2017-05-28T03:40:53.190Z") (详见 #a4)

展示到前端的时候,需要格式化处理一下

var moment = require('moment')

...
// 查找
Blog.find({}, function(err, data) {
    for(var i=0; i

schema.pre

...
var schema = new Schema({.
    intro: String,
}, {
    timestamps: true,// 自动加updatedAt和createdAt字段,且下次更新文档时,updatedAt字段会自动更新
})

// 保存时调用
schema.pre('save', function(next, done) {
    console.log(this.isNew)
    next()
})

// 更新时调用
schema.pre('update', function(next, done) {
    console.log(this.getUpdate())
    var intro = this.getUpdate().$set.intro
    if(intro) {
        this.update({}, { intro: intro +'something' })
    }
    console.log(this.getUpdate())
    next()
})
...

populate(关联查询) (详见 #c)

movie.js(不关联任何集合)

...
var schema = new Schema({
    title: String,
    intro: String,
})

module.exports = mongoose.model('Movie', schema)

user.js(关联Movie集合)

...
var schema = new Schema({
    movie: {
        type: Schema.Types.ObjectId, ref: 'Movie',// 关联Movie集合,且只有一个,可以用$addToSet来更新此字段
    },
    username: {
        type: String,
        unique: true,
    },
    password: {
        type: String,
    },
})

module.exports = mongoose.model('User', schema)

article.js(关联User集合)

...
var schema = new Schema({
    user: [{
        type: Schema.Types.ObjectId,
        ref: 'User',
    }],// 关联User集合,且可以有多个,可以用$push来更新此字段
    title: String,
    content: String,
})

schema.statics = {
    findByTitle: function(title) {
        return this
        .find({title: title})
        .populate([// 因为User集合里面关联了Movie集合,所以populate里面嵌套populate可以用来设置最里面的那层集合所要显示的字段信息
            {path: 'user', select: '-_id movie username' populate: {path: 'movie'}}
        ])
    }
}

module.exports = mongoose.model('Article', schema)

app.js

...
// 调用这个接口,cmd中查看效果
router.all('/findByTitle', function(req, res) {
    Article.findByTitle(req.body.title)
    .then(function(data) {
        console.log(data)
    })
    .catch(function(err) {
        console.log(err)
    })
})
...

参考文章

Mongoose [#a]

Mongoose 英文文档 [#1] Mongoose 中文文档 [#2] Mongoose 的exec(cb)具体什么意思啊? [#3] mongo-日期类型(2) [#4]

Mongoose Promise [#b]

“mpromise (mongoose’s default promise library) is deprecated” error when testing [duplicate] [#1] Promise.promisifyAll [#2]

populate(关联查询) [#c]

Mongoose Populate 基本使用 [#1]

Tags:MO ON NG GO 
作者:网络 来源:vcxiaohan的