代码之家  ›  专栏  ›  技术社区  ›  Mansa

获取聚合中嵌套数组的和

  •  1
  • Mansa  · 技术社区  · 7 年前

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

    我有一份这样的文件:

    {
      "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 回复  |  直到 7 年前
        1
  •  1
  •   Neil Lunn    7 年前

    你得说 $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 .

    另一件你似乎不知道的事是 美元集团 只输出告诉它的字段,因此如果您想在其他阶段或输出中访问其他字段,则需要将它们与 $first 或者另一个累加器。我们似乎也错过了一个管道阶段的问题无论如何,但值得注意的只是要确定。

    还要注意,您确实应该将聚合管道包装为正式数组 [] ,因为旧用法已被弃用,并可能在某些语言实现中导致问题。

    返回正确的课程详细信息:

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