折腾了几天在重构message的代码,一直想要优化这一块,message对象之前是这个样子的:
var mongoose = require('mongoose');
var shortid = require('shortid');
var Schema = mongoose.Schema;
var message = new Schema({
_id: {
type: String,
unique: true,
'default': shortid.generate
},
contentId : String, //留言对应的内容ID
contentTitle : String, // 留言对应的内容标题
uName : String, // 评论者用户名
uid : String, // 评论者ID
uEmail : String, // 评论者邮箱
ulogo : String, // 评论者头像
relationUid : String, // 关联用户ID
relationEmail : String, // 关联用户邮箱(被评论者)
date: { type: Date, default: Date.now }, // 留言时间
praiseNum : {type : Number , default : 0}, // 被赞次数
hasPraise : {type : Boolean , default : false}, // 当前是否已被点赞
praiseMembers : String, // 点赞用户id集合
content: { type : String , default : "输入评论内容..."}// 留言内容
});
var Message = mongoose.model("Message",message);
module.exports = Message;问题在哪呢?重复的属性太多,不灵活。记录了留言者和关联对象的属性,如果遇到后面的拓展,例如需要留言者的更多信息怎么办呢?或者关联者的信息发生变化呢,保存的都是静态信息,这条message也就没有存在的意义了。最近也在看mongoose的相关文档,提到了DBref,也就是关联对象,当属性和相关对象关联后,通过mongoose的populate查询方式就可以查出相关联对象的详细信息,这样,我就不需要再记录多余的属性了。修改后的代码是这样的:
var mongoose = require('mongoose');
var shortid = require('shortid');
var Schema = mongoose.Schema;
var AdminUser = require('./AdminUser');
var User = require('./User');
var MessageSchema = new Schema({
_id: {
type: String,
unique: true,
'default': shortid.generate
},
contentId : String, // 留言对应的内容ID
contentTitle : String, // 留言对应的内容标题
author : {
type : String,
ref : 'User'
}, // 留言者ID
replyAuthor : {
type : String,
ref : 'User'
}, // 被回复者ID
adminAuthor : {
type : String,
ref : 'AdminUser'
},// 管理员ID
utype : {type : String ,default : '0'}, // 评论者类型 0,普通用户,1,管理员
relationMsgId : String, // 关联的留言Id
date: { type: Date, default: Date.now }, // 留言时间
praiseNum : {type : Number , default : 0}, // 被赞次数
hasPraise : {type : Boolean , default : false}, // 当前是否已被点赞
praiseMembers : String, // 点赞用户id集合
content: { type : String , default : "输入评论内容..."}// 留言内容
});
MessageSchema.post('save',function(doc){
console.log('new message has been add success');
});
var Message = mongoose.model("Message",MessageSchema);
module.exports = Message;如何查询呢?
Message.find({'contentId' : contentId}).populate('author').exec(function(err,callBack));非常简单。
由于改动比较大,不得已把大家的留言全部清空了,在这里说声抱歉了。只为系统更加完善和稳定,除message模块外,其它地方也有比较大的改动和优化,上线几天测一下,没大问题再commit到代码库中。