【问题标题】:Mongo - Sum from values in several ref object arraysMongo - 从几个 ref 对象数组中的值求和
【发布时间】:2017-02-12 21:44:02
【问题描述】:

我有两个 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 对象。还需要先填充对象,以便读取点值。

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用 $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);
    });
    

    【讨论】:

    • 非常感谢!我只想说 $lookup 需要更新版本的 MongoDB。 3.2+ 我相信。这不适用于 2.6.2。
    猜你喜欢
    • 2016-09-05
    • 2021-11-15
    • 1970-01-01
    • 2021-08-09
    • 2021-08-07
    • 2016-08-19
    • 1970-01-01
    • 2018-06-22
    • 2022-12-04
    相关资源
    最近更新 更多