自动计算字段

时间:2012-05-07 17:31:31

标签: mongodb automation mongoose

以下是我的应用程序的架构。在“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]
    }
});

2 个答案:

答案 0 :(得分:4)

我会使points字段成为正常的Number字段,并在递增upvotesdownvotes时适当地递增(或递减)它(此处使用常规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 
})

这样,每次保存数据时,都会刷新点值。缺点是,即使没有改变下行/上行,它也会被刷新。

警告:如果多个应用程序使用相同的数据库,请格外小心,您希望在任何地方应用相同的逻辑。