获取Aggregate中嵌套数组的总和

时间:2018-06-06 07:49:11

标签: mongodb aggregation-framework

好的,我有一个似乎无法解决的问题。

我有这样的文件:

{
  "playerId": "43345jhiuy3498jh4358yu345j",
  "leaderboardId": "5b165ca15399c020e3f17a75",
  "data": {
    "type": "EclecticData",
    "holeScores": [
      {
        "type": "RoundHoleData",
        "xtraStrokes": 0,
        "strokes": 3,
      },
      {
        "type": "RoundHoleData",
        "xtraStrokes": 1,
        "strokes": 5,
      },
      {
        "type": "RoundHoleData",
        "xtraStrokes": 0,
        "strokes": 4
      }
    ]
  }
}

现在,我想要完成的是使用汇总和笔画然后再订购。我正在尝试这个:

var sortedBoard = db.collection.aggregate(
    {$match: {"leaderboardId": boardId}},
    {$group: {
        _id: "$playerId",
        played: { $sum: 1 },
        strokes: {$sum: '$data.holeScores.strokes'}
        }
    },
    {$project:{ 
        type: "$SortBoard",
        avgPoints: '$played',
        sumPoints: "$strokes",
        played : '$played'
    }}
);

这里的问题是我做网络得到笔画总和正确,因为这是在另一个数组内。

希望有人可以帮助我,并提前感谢: - )

1 个答案:

答案 0 :(得分:1)

您需要说$sum 两次

var sortedBoard = db.collection.aggregate([
  { "$match": { "leaderboardId": boardId}},
  { "$group": {
    "_id": "$playerId",
    "SortBoard": { "$first": "$SortBoard" },
    "played": { "$sum": 1 },
    "strokes": { "$sum": { "$sum": "$data.holeScores.strokes"} }
  }},
  { "$project": { 
    "type": "$SortBoard",
    "avgPoints": "$playeyed",
    "sumPoints": "$strokes",
    "played": "$played"
  }}
])

原因是因为您使用两者作为“汇总数组值”的方式,也将$group用作“累加器”。

您似乎缺少的另一件事是$group只输出您告诉它的字段,因此如果您想要访问其他阶段或输出中的其他字段,您需要保留{ {3}}或其他累加器。无论如何,我们似乎也在问题中错过了一个管道阶段,但值得注意的只是确定。

另请注意,您确实应该将聚合管道包装为官方数组[],因为旧版用法已被弃用,并且可能会导致某些语言实现出现问题。

当然返回正确的详细信息:

{
        "_id" : "43345jhiuy3498jh4358yu345j",
        "avgPoints" : 1,
        "sumPoints" : 12,
        "played" : 1
}