我希望每次将新元素添加到集合时计算平均值。基本上,我试图计算的是“预先保存”#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")})
聚合中是否有任何遗漏?
答案 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> }, ... } }