数据格式:
{
"_id" : 1,"durationId" : 201505181130,
"feeds" : {
"9" : {
"CommentUserIds" : [
3
],
"CreateTime" : "201503282000",
"WeightPerDuration" : 713.7724609375
},
"10" : {
"LikeUserIds" : [
4
],
"CreateTime" : "201503281930",
"WeightPerDuration" : 713.7719116210938
}
}
}
{
"_id" : 2,"durationId" : 201505181200,
"feeds" : {
"9" : {
"CommentUserIds" : [
3
],
"CreateTime" : "201503282000",
"WeightPerDuration" : 713.7724609375
},
"10" : {
"LikeUserIds" : [
4
],
"CreateTime" : "201503281930",
"WeightPerDuration" : 713.7719116210938
}
}
}
Aggregate feedId为9的数组去重相加:
db.feed.aggregate( {$match:{"durationId":{$gt:1}} ,{$project: {commentWeight: { $size:{$ifNull: ["$feeds.9.CommentUserIds",[]]} }, likeWeight: { $size:{$ifNull: ["$feeds.9.LikeUserIds",[]]} }, shareWeight: { $size:{$ifNull: ["$feeds.9.ShareUserIds",[]]} }, viewWeight: { $size:{$ifNull: ["$feeds.9.ViewUserIds",[]]} }, detailWeight: { $size:{$ifNull: ["$feeds.9.DetailUserIds",[]]} }} })
MapReduce 根据feedId分组,求WeightPerDuration和:
mr = db.runCommand({
"mapreduce" : "feed",
"map" : function() {
for (var key in this.feeds) {
emit(key, this.feeds[key].WeightPerDuration);
}
},
"reduce" : function(key, values) { return Array.sum(values); },
"query" : { durationId : {$gte:1}, durationId : {$lte:1} },
"out": "feed" + "_keys"
})