计算Mongoose钩内的平均值

时间:2015-08-11 22:40:56

标签: javascript mongodb mongoose

我希望每次将新元素添加到集合时计算平均值。基本上,我试图计算的是“预先保存”#34;钩子,但我总是得到不确定的结果。

这是架构:

var CommentSchema = new Schema({
    posted:{
        type:Date,
        default:Date.now
    },
    text:{
        type: String
    },
    owner:{
            _id:{ 
                type: Schema.Types.ObjectId, ref: 'User'
            },
            displayName:{ 
                type:String 
            }
    },
    reference: {
        objectType:{
            type: String,
            enum: [ 'document','element','process', 'project', 'story']
        },
        _id:{ 
            type: Schema.Types.ObjectId 
        }
    },
    sentiment:{
        score:{
            type:Number,
            default:0.0
        },
        comparative:{
            type:Number,
            default:0.0
        }
    }
});

CommentSchema.pre('save', function(next){
        var thiz = this; 
        // this code is inside another callback, that's the reason I'm using thiz
        if(thiz.reference.objectType ==='element'){
            mongoose.models['Comment'].aggregate([
            { $match:{'reference._id': mongoose.Types.ObjectId(thiz.reference._id)} },
            { $group:{'reference._id': mongoose.Types.ObjectId(thiz.reference._id), average:{$avg:'$sentiment.score'}}}
            ],
            function(err, result){
                console.log('------------------');
                console.log('result',result);
                console.log('------------------');
            }               
            );
        }
        next();
});

我总是得到未定义的结果,但是,如果我像下面的例子一样查询,我会得到评论列表。

db.getCollection('comments').find({"reference._id":ObjectId("55a69276242aa1837a1ecb6c")})

聚合中是否有任何遗漏?

1 个答案:

答案 0 :(得分:1)

{ $group: { _id: null, average: { $avg: '$sentiment.score' } } }
  

“_id字段是必填字段;但是,您可以指定_id值   null将所有输入文档的累计值计算为a   整“。

     

http://docs.mongodb.org/manual/reference/operator/aggregation/group/

$group: { _id: <expression>, <field1>: { <accumulator1> : <expression1> }, ... } }