4

下面是我的应用程序的架构。在“元”下,我必须有一个名为“upvotes”和“downvotes”的字段,并且我想要一个用于显示总点数的字段(upvotes - downvotes)。至于现在我在客户端计算这个,但我也希望能够按点排序(点数最多的图像首先降序)。

有没有办法在猫鼬中自动计算一个字段,如果是这样,它是如何完成的?

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]
    }
});
4

2 回答 2

5

您应该使用Mongoose 中间件

schema.pre('save', function (next) {
    // set points value based on positive and negatives 
})

这样,每次保存数据时,都会刷新积分值。不利的一面是,即使不赞成/反对票没有改变,它也会被刷新。

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

于 2012-05-09T13:49:21.380 回答
4

我会将该字段设为普通的 Number 字段,并points在您递增时适当地递增(或递减)它(此处使用常规 JS shell 语法显示,但该技术也适用于 mongoose):upvotesdownvotes

// when upvoting
db.image.update({/* criteria */}, {$inc: {upvotes: 1, points: 1}})

// when downvoting
db.image.update({/* criteria */}, {$inc: {downvotes: 1, points: -1}})

如果您有现有数据,则需要points从现有对象生成字段,但是一旦拥有它,由于 MongoDB 更新和操作符的原子性质,它将保持同步$inc

于 2012-05-07T18:02:41.620 回答