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

时间:2019-03-04 22:20:44

标签: 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'},

无论出于何种原因,随着时间的推移,同一部电影“ fargo”已被标记为不同的_id,但它是同一部电影。换句话说,电影的真正关键是name,而不是通常想象的_id

现在,我想做的是通过 aggregation 管道group name观看所有电影,而忽略了它们可能具有不同的{{ 1}} s,然后计算他们收到的 的票数。

因此,在该示例的情况下,由于聚合,我希望收到类似

的信息
_id

到目前为止,我已经尝试过

{name: 'fargo', votes: [ {vote: 'good', count: 3}, {vote: 'bad', count: 1} ]}

但没有运气。

任何了解我在哪里犯错的建议都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

这是您要寻找的:

[
    {$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"}
    }}
]

输出(用于您的示例文档)

{
  "_id" : "fargo",
  "good" : 3.0,
  "bad" : 1.0
}

流水线阶段的说明:

  1. 项目:将举动的名称用作_id,并用数字表示投票
  2. 组:对每部电影分别计票