以下是我的应用程序的架构。在“meta”下,我必须使用称为“upvotes”和“downvotes”的字段,我想要一个总点数的字段(upvotes - downvotes)。至于现在我在客户端计算这个,但我也希望能够按点排序(最先点和下降点的图像)。
是否有某种方法可以自动计算Mongoose中的字段?若然,它是如何完成的?
var ImageSchema = new Schema({
name : String,
size : Number,
title : String,
body : String,
buf : Buffer,
date: { type: Date, default: Date.now },
comments : [CommentSchema],
meta : {
upvotes : Number,
downvotes : Number,
points : ? // <- upvotes - downvotes
favs : Number,
uniqueIPs : [String],
tags : [String]
}
});
答案 0 :(得分:4)
我会使points
字段成为正常的Number字段,并在递增upvotes
和downvotes
时适当地递增(或递减)它(此处使用常规JS shell语法显示,但是该技术也适用于mongoose):
// when upvoting
db.image.update({/* criteria */}, {$inc: {upvotes: 1, points: 1}})
// when downvoting
db.image.update({/* criteria */}, {$inc: {downvotes: 1, points: -1}})
如果您有现有数据,则需要从现有对象生成points
字段,但是一旦拥有它,由于MongoDB更新和{{的原子性质,它将同步1}} operator。
答案 1 :(得分:4)
您应该使用Mongoose middleware:
schema.pre('save', function (next) {
// set points value based on positive and negatives
})
这样,每次保存数据时,都会刷新点值。缺点是,即使没有改变下行/上行,它也会被刷新。
警告:如果多个应用程序使用相同的数据库,请格外小心,您希望在任何地方应用相同的逻辑。