Mongo - 来自几个ref对象数组中的值的Sum

时间:2016-10-04 16:11:41

标签: javascript node.js mongodb mongoose aggregation-framework

我有两个Mongoose架构/模型。一个用于Team个玩家,一个用于Players个用户。

团队

// Other less relevant stuff
goalkeepers: [{
  type: mongoose.Schema.Types.ObjectId,
  ref: 'Player'
}],
defenders: [{
  type: mongoose.Schema.Types.ObjectId,
  ref: 'Player'
}],
midfielders: [{
  type: mongoose.Schema.Types.ObjectId,
  ref: 'Player'
}],
attackers: [{
  type: mongoose.Schema.Types.ObjectId,
  ref: 'Player'
}],
points: Number

播放器

// Other less relevant stuff
points: Number

问题在于我需要Team点作为每个位置数组中Players的所有点的总和。

我目前正在研究的领域是MongoDB聚合函数,特别是$sum,但没有一个示例包含ref个对象。首先需要填充对象,以便可以读取点值。

我觉得以前有人必须遇到过这个问题但不幸的是我的搜索都是徒劳的。

1 个答案:

答案 0 :(得分:0)

您可以使用 $lookup 运算符在ref字段上进行连接。但首先你需要创建一个包含所有玩家_id的字段,最好的操作符是 $setUnion 运算符,它接受两个或多个数组并返回一个包含出现在任何输入数组中的元素。这是 $project 管道阶段的理想选择,您可以将所有数组字段与播放器引用组合成一个数组,然后您可以 denormalise ,为 $lookup 加入做准备。

考虑以下聚合管道:

Team.aggregate([
  { 
    "$project": {
      "players": {
        "$setUnion": [
          "$goalkeepers", 
          "$defenders", 
          "$midfielders", 
          "$attackers"
        ]
      }
    }       
  },
  { "$unwind": "$players" },
  { 
    "$lookup": {
      "from": "players",
      "localField": "players",
      "foreignField": "_id",
      "as": "resultingArray"
    }
  },
  { "$unwind": "$resultingArray" },
  {
    "$group": {
      "_id": "$_id",
      "total": { "$sum": "$resultingArray.points" } 
    }
  }
], function(err, result){
  console.log(result);
});