聚合对象Mongo / Meteor中数组的所有项

时间:2016-05-29 16:29:46

标签: mongodb meteor aggregation-framework

我从流星反应聚合包中获得了这个聚合发布函数。我正在尝试聚合Matches数组中的所有值。不知道我需要在函数中指定聚合的数组(读取文档我不确定在哪里)。我也尝试了一些不成功的事情。

发布聚合

Meteor.publish('reportTotals', function() {
ReactiveAggregate(this, Players, [{
//grouping the items
$group: {
  '_id': this.userId,
  'score': {
    $sum: '$score'
  },
  'assists': {
    $sum: '$assists'
  }
}
}, {
$project: {
  score: '$score',
  assists: '$assists'
}
 }], {
     clientCollection: 'playerReport'
  });
});

这是一个对象的例子,其中可能有多个匹配,我需要编译分数,助攻等。

{  "_id": "WhrZCTtj9HHtDB3rs",
   "name": "Test player",
   "team": "TThqi8Wu6YJh6mapC",
   "practicesAttended": 3,
   "createdBy": "RKtpy532sgzbBpP4J",
   "createdAt": "2016-05-29T16:26:47.837Z",
   "notes": "Small test notes",
   "itemImage": "Lfb27GnWXDRxfkajL",
   "Matches": [
    {
      "match": "2016-05-21",
      "score": 3,
      "shotsTaken": 4,
      "assists": 0,
      "duelsWon": 4,
      "duelsLost": 2,
      "tacklesWon": 0,
      "tacklesLost": 0,
      "blocks": 51
    }
  ]
 }

1 个答案:

答案 0 :(得分:1)

使用 $unwind 运算符,它会将嵌入式数组展开或展平为多个独特元素。因此,对于每个输入文档,它输出n个文档,其中n是数组元素的数量,对于空数组可以为零。

注意:应用 $unwind 的字段名称应以$为前缀(美元符号)

在上面的案例中,将 $unwind 导入 $group 。这类似于在LEFT JOIN ... GROUP BY中使用SQL

Meteor.publish('reportTotals', function() {
    ReactiveAggregate(this, Players, [
        // unwind the Matches list
        { "$uniwnd": "$Matches" },
        //grouping the items
        {
            "$group": {
                "_id": this.userId,
                "score": { "$sum": "$Matches.score" },
                "assists": { "$sum": "$Matches.assists" }
            }
        }
    ], { clientCollection: 'playerReport' });
});