我有一个用户集合,其中每个文档都具有以下结构:

{
  "_id": "<id>",
  "login": "xxx",
  "solved": [
    {
      "problem": "<problemID>",
      "points": 10
    },
    ...
  ]
}

字段solved可以为空或包含任意多个子文档。我的目标是获取用户列表以及总分(points的总和),其中尚未解决任何问题的用户将被分配总分0。这是否可以通过单个查询来完成(理想情况下使用汇总框架)?

我试图在聚合框架中使用以下查询:
{ "$group": {
  "_id": "$_id",
  "login": { "$first": "$login" },
  "solved": { "$addToSet": { "points": 0 } }
} }
{ "$unwind": "$solved" }
{ "$group": {
  "_id": "$_id",
  "login": { "$first": "$login" },
  "solved": { "$sum": "$solved.points" }
} }

但是我得到以下错误:
exception: The top-level _id field is the only field currently supported for exclusion

先感谢您

最佳答案

在MongoDB 3.2和更高版本中, $unwind 运算符现在具有一些选项,其中特别是preserveNullAndEmptyArrays选项将解决此问题。

如果此选项设置为true,并且路径为空,缺少或为空数组,则 $unwind 输出文档。如果为false,则在路径为空,缺少或为空数组的情况下, $unwind 不会输出文档。在您的情况下,将其设置为true:

db.collection.aggregate([
    { "$unwind": {
            "path": "$solved",
            "preserveNullAndEmptyArrays": true
    } },
    { "$group": {
        "_id": "$_id",
        "login": { "$first": "$login" },
        "solved": { "$sum": "$solved.points" }
    } }
])

08-28 03:58