2

我在 MongoDb 集合中有这种文档:

[
  {
    "_id": {
      "id": 892,
      "answer": "C",
      "level": "regular"
    },
    "total": 4
  },
  {
    "_id": {
      "id": 891,
      "answer": "Regular",
      "level": "neutral"
    },
    "total": 3
  },
  {
    "_id": {
      "id": 892,
      "answer": "B",
      "level": "regular"
    },
    "total": 3
  },
  {
    "_id": {
      "id": 891,
      "answer": "Ótimo",
      "level": "positive"
    },
    "total": 5
  },
  {
    "_id": {
      "id": 892,
      "answer": "E",
      "level": "regular"
    },
    "total": 3
  },
  {
    "_id": {
      "id": 891,
      "answer": "Bom",
      "level": "positive"
    },
    "total": 1
  },
  {
    "_id": {
      "id": 891,
      "answer": "Ruim",
      "level": "negative"
    },
    "total": 2
  },
  {
    "_id": {
      "id": 892,
      "answer": "D",
      "level": "regular"
    },
    "total": 3
  },
  {
    "_id": {
      "id": 891,
      "answer": "Péssimo",
      "level": "negative"
    },
    "total": 3
  },
  {
    "_id": {
      "id": 892,
      "answer": "F",
      "level": "regular"
    },
    "total": 1
  }
]

我正在尝试使用 MongoDb 聚合管道计算answer和发生次数。level我期待这样的输出:

[
  {
    "id": 891,
    "answers": [
      {
        "answer": "Ótimo",
        "count": 5
      },
      {
        "answer": "Bom",
        "count": 1
      },
      {
        "answer": "Regular",
        "count": 3
      },
      {
        "answer": "Ruim",
        "count": 2
      },
      {
        "answer": "Péssimo",
        "count": 3
      }
    ],
    "levels": [
      {
        "level": "positive",
        "count": 6
      },
      {
        "level": "neutral",
        "count": 3
      },
      {
        "level": "negative",
        "count": 5
      }
    ],
    "total": 14
  },
  {
    "id": 892,
    "answers": [
      {
        "answer": "B",
        "count": 3
      },
      {
        "answer": "C",
        "count": 4
      },
      {
        "answer": "D",
        "count": 3
      },
      {
        "answer": "E",
        "count": 3
      },
      {
        "answer": "F",
        "count": 1
      },
    ],
    "levels": [
      {
        "level": "regular",
        "count": 14
      }
    ],
    "total": 14
  }
]

如何使用 MongoDb 聚合管道实现所需的输出?

编辑:实际上我已经在使用 $group 来实现类似的目标,但我猜在管道上只有一个 $group 步骤不会达到预期的输出。这是我当前的 $group 步骤:

{
  $group: {
    _id: {
      id: "$_id.id"
    },
    answers: {
      $push: {
        answer: "$_id.answer",
        count: "$count"
      }
    },
    levels: {
      $push: {
        level: "$_id.level",
        count: "$count"
      }
    },
    total: { $sum: "$count" }
  }
}

这是我到目前为止的输出:

[
  {
    "_id": {
      "id": 892
    },
    "answers": [
      {
        "answer": "F",
        "count": 1
      },
      {
        "answer": "D",
        "count": 3
      },
      {
        "answer": "E",
        "count": 3
      },
      {
        "answer": "C",
        "count": 4
      },
      {
        "answer": "B",
        "count": 3
      }
    ],
    "levels": [
      {
        "level": "regular"
      },
      {
        "level": "regular"
      },
      {
        "level": "regular"
      },
      {
        "level": "regular"
      },
      {
        "level": "regular"
      }
    ]
  },
  {
    "_id": {
      "id": 891
    },
    "answers": [
      {
        "answer": "Ruim",
        "count": 2
      },
      {
        "answer": "Péssimo",
        "count": 3
      },
      {
        "answer": "Bom",
        "count": 1
      },
      {
        "answer": "Regular",
        "count": 3
      },
      {
        "answer": "Ótimo",
        "count": 5
      }
    ],
    "levels": [
      {
        "level": "negative"
      },
      {
        "level": "negative"
      },
      {
        "level": "positive"
      },
      {
        "level": "neutral"
      },
      {
        "level": "positive"
      }
    ]
  }
]
4

1 回答 1

0

以下聚合管道:

{ $group: {
  _id: { id: "$_id.id" },
  answers: {
    $push: {
      answer: "$_id.answer",
      level: "$_id.level",
      count: "$total"
    }
  },
  levels: {
    $push: {
      level: "$_id.level",
      count: "$total"
    }
  }
}},
{ $unwind: $levels },
{ $group: {
  _id: {
    id: "$_id.id",
    level: "$levels.level"
  },
  answers: { $addToSet: "$answers" },
  total: { $sum: "$levels.count" }
}},
{ $group: {
  _id: { id: "$_id.id" },
  answers: { $addToSet: "$answers" },
  levels: {
    $push: {
      level: "$_id.level",
      count: "$total"
    }
  },
  total: { $sum: "$total" }
}},
{ $project: {
  _id: 0,
  id: "$_id.id",
  answers: 1,
  levels: 1,
  total: 1
}}

将产生所需的输出。

于 2016-06-22T17:33:45.683 回答