4

以下は私のアプリケーションのスキーマです。「メタ」の下に、「賛成」と「反対」と呼ばれるフィールドが必要です。合計ポイント数のフィールドが必要です(賛成-反対)。今のところ、これはクライアント側で計算していますが、ポイント(ほとんどのポイントが最初で降順の画像)で並べ替えることもできるようにしたいと思います。

マングースでフィールドを自動計算する方法はありますか?もしそうなら、それはどのように行われますか?

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 
})

このように、データを保存するたびに、ポイント値が更新されます。欠点は、反対/賛成票を変更しなくても更新されることです。

警告:複数のアプリケーションが同じDBを使用する場合は、特に注意してください。同じロジックをどこにでも適用する必要があります。

于 2012-05-09T13:49:21.380 に答える
4

フィールドをpoints通常の数値フィールドにし、インクリメントするにつれて適切にインクリメント (またはデクリメント) しますupvotes(downvotesここでは通常の JS シェル構文を使用していますが、この手法はマングースでも機能します)。

// 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 に答える