Mongoose学习笔记
来源:互联网 发布:c语言代码实例 编辑:程序博客网 时间:2024/04/29 12:58
重点记录
关键词
.lean()
使返回的数据可操作{new: true}
返回更新后的数据
基本操作 (详见 #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// 定义 Schemavar blogSchema = new Schema({ index: Number, sex: String,})// 编译 modelvar 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<data.length; i++) { console.log(moment(data[i].data).format('MM-DD-YYYY HH:mm:ss')) }})// 链式查询Blog.find({}).skip(1)// 跳过 1 个.limit(10)// 最多 10 个.sort({index: -1})// 按 index 倒序排列.select({index: 1})// 只展示 index 和 _id 键.exec(function(err, data) {// 执行回调 console.log(err, data)})// 更新Blog.updateAsync({}, {sex: 'male'}).then(function(data) { console.log(data)}).catch(function(err) { console.log(err)})// 批量更新var cursor = Blog.find({}).cursor()// 每次查到一个文档,触发一次cursor.on('data', function(data) { console.log(data)})// 所有文档查询完毕后,触发cursor.on('close', function() { })// 找到一个并更新且返回更新前的文档信息Blog.findOneAndUpdateAsync({index: 200}, {index: 100}).then(function(data) { console.log(data)}).catch(function(err) { console.log(err)})// 删除Blog.removeAsync({index: 100}).then(function(data) { console.log(data)})console.log('server...')
自定义验证
...var Schema = mongoose.Schema// 定义 Schemavar 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<data.length; i++) { console.log(moment(data[i].data).format('YYYY-MM-DD HH:mm:ss'))// 2017-06-16 17:43:24 }})
schema.pre
...var schema = new Schema({. intro: String,}, { timestamps: true,// 自动加updatedAt和createdAt字段,且下次更新文档时,updatedAt字段会自动更新 versionKey: false,// 取消自动插入文档版本号(__v)字段})// 保存时调用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) })})...
expires(设置字段过期自动删除)
var mongoose = require('mongoose')var Schema = mongoose.Schemavar schema = new Schema({ filename: String, expire: { type: Date, default: Date.now,// 注意Date.now和Date.now()有很大区别,前者是函数,每次新建模型添加的时间都会变化,而后者是一个固定的时间 expires: 10,// 10秒后该字段会过期,且从数据库自动删除(我试过,这个属性太诡异,不建议使用) },})
可以开启定时任务代替expires去检查某个文档是否过期
求解,一个关于mongoose expires(过期删除)的问题?
schema_date_SchemaDate-expires
Updating “expires” with mongoose
aggregate拆分空数组
数据示例
{ "_id" : ObjectId("597ffa468830d135e0a7b555"), "role" : []}
{$unwind: '$role'}
拆分后得到空,这不是我们想要的结果可以
{$project: {role: {$cond : [{$eq: ["$role", []] }, [''], '$role']}}},
使数据变成{ "_id" : ObjectId("597ffa468830d135e0a7b555"), "role" : ['']}
- 这样再使用
{$unwind: '$role'}
拆分就好了
参考文章
Mongoose [#a]
- Mongoose 英文文档 [#1]
- Mongoose 中文文档 [#2]
- Mongoose 的exec(cb)具体什么意思啊? [#3]
- mongo-日期类型(2) [#4]
- mongoose查找出来的数据无法修改 [#5]
Mongoose Promise [#b]
- “mpromise (mongoose’s default promise library) is deprecated” error when testing [duplicate] [#1]
- Promise.promisifyAll [#2]
populate(关联查询) [#c]
- Mongoose Populate 基本使用 [#1]
聚合管道
mongodb进阶二之mongodb聚合
阅读全文
1 0
- mongoose学习笔记一
- Mongoose 学习笔记
- Mongoose学习笔记
- Mongoose增查改删学习笔记
- Node.js + mongoose + mongodb 学习笔记
- MongoDB学习笔记之Mongoose的使用
- MongoDB学习笔记之Mongoose的使用
- mongoose 笔记
- Mongoose 学习
- mongoose学习
- 学习极客的mongoose+express的笔记(2)
- Nodejs学习笔记(十四)— Mongoose介绍和入门
- mongoose 入门笔记
- Mongoose的用法笔记
- Mongoose学习参考文档
- Mongoose学习参考文档
- Mongoose学习参考文档
- Mongoose学习参考文档
- mycat1.5+mysql5.7+centos7
- 算法----五大算法之动态规划
- Android Studio中设置注释模板
- 重读网峰A8文档---之---构建根文件系统
- mysql获取当前时间,前一天,后一天
- Mongoose学习笔记
- QT中的编码
- 【Oracle学习】之 游标(CURSOR)
- ArrayList扩容机制
- 高效程序员的45个习惯
- 算法----五大算法之分治法
- 如何解决数据保存数据库后出现中文变"?"的问题
- Intellij idea安装scala插件详解
- maven pom.xml添加servler支持