我有一些文件,每个文件代表电影的票。每个文档都包含描述电影的内部文档。像这样
{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}
]}
但没有运气。
任何了解我在哪里犯错的建议都会受到赞赏。
答案 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
}
流水线阶段的说明:
_id
,并用数字表示好和坏投票