下面是我的应用程序的架构。在"meta“下,我需要一个叫做”向上投票“和”向下投票“的字段,我想要一个表示总点数的字段(向上投票-向下投票)。至于现在,我在客户端计算,但我也希望能够按点排序(具有最多点的图像首先和降序)。
在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]
}
});发布于 2012-05-08 02:02:42
我会将points字段设置为普通的数字字段,并在您递增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更新的原子性质和$inc操作符,它将是同步的。
发布于 2012-05-09 21:49:21
您应该使用Mongoose middleware:
schema.pre('save', function (next) {
// set points value based on positive and negatives
})这样,每次保存数据时,点数值都会刷新。缺点是,即使向下/向上投票没有改变,它也会被刷新。
警告:要格外小心如果多个应用程序使用同一个DB,您希望在所有地方都应用相同的逻辑。
https://stackoverflow.com/questions/10486419
复制相似问题