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
,用数字表示好票和坏票