Mongodb Mongo:如何基于作为内部文档属性的键对集合的文档进行分组

Mongodb Mongo:如何基于作为内部文档属性的键对集合的文档进行分组,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个文件集,每个文件代表一部电影的投票。每个文档都包含一个描述电影的内部文档。像这样的 {movie: {_id: '123', name: 'fargo'}, vote: 'good'}, {movie: {_id: 'abc', name: 'fargo'}, vote: 'good'}, {movie: {_id: 'abc', name: 'fargo'}, vote: 'bad'}, {movie: {_id: 'xyz', name: 'fargo'}, vote: 'good'

我有一个文件集,每个文件代表一部电影的投票。每个文档都包含一个描述电影的内部文档。像这样的

{movie: {_id: '123', name: 'fargo'}, vote: 'good'},
{movie: {_id: 'abc', name: 'fargo'}, vote: 'good'},
{movie: {_id: 'abc', name: 'fargo'}, vote: 'bad'},
{movie: {_id: 'xyz', name: 'fargo'}, vote: 'good'},
无论出于何种原因,随着时间的推移,同一部电影《法戈》被标记为不同的
\u id
,但它是同一部电影。换句话说,电影的真正关键是名字,而不是想象中的id

现在我想做的是,通过聚合管道
对所有具有相同
名称
的电影进行分组
,忽略它们可能具有不同
\u id
的事实,并统计它们收到的好的坏的投票数

因此,在本例中,我希望作为聚合的结果

{name: 'fargo', votes: [
  {vote: 'good', count: 3},
  {vote: 'bad', count: 1}
]}
到目前为止我已经试过了

{$group:{{u id:{movieName:$movie.name”,投票:$vote},计数:{$sum:1},}}

但是没有运气


任何关于我在哪里犯错误的建议都将不胜感激。

这就是您想要的:

[
    {$project: {
      _id: "$movie.name",
      "good": {$cond: {if: {$eq: ["$vote","good"]}, then: 1, else: 0}},
      "bad": {$cond: {if: {$eq: ["$vote","bad"]}, then: 1, else: 0}}
    }},
    {$group: {
      _id: "$_id",
      good: {$sum: "$good"},
      bad: {$sum: "$bad"}
    }}
]
输出(对于示例文档):

管道阶段说明:

  • 项目:使用移动的名称作为
    \u id
    ,用数字表示好票和坏票
  • 分组:对每部电影分别计票

  • 这就是您正在寻找的:

    [
        {$project: {
          _id: "$movie.name",
          "good": {$cond: {if: {$eq: ["$vote","good"]}, then: 1, else: 0}},
          "bad": {$cond: {if: {$eq: ["$vote","bad"]}, then: 1, else: 0}}
        }},
        {$group: {
          _id: "$_id",
          good: {$sum: "$good"},
          bad: {$sum: "$bad"}
        }}
    ]
    
    输出(对于示例文档):

    管道阶段说明:

  • 项目:使用移动的名称作为
    \u id
    ,用数字表示好票和坏票
  • 分组:对每部电影分别计票