[英]Mongo: how to group documents of a collection based on a key which is a property of a inner document
我有一些文件,每个文件代表电影的票。 每个文档都包含描述电影的内部文档。 像这样
{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
。
现在我想做的是group
,通过聚合管道,用相同的所有电影name
,忽略了一个事实,他们可能有不同的_id
秒,算上他们已经收到了好的和坏 的票数。
因此,在该示例的情况下,我希望通过聚合收到类似
{name: 'fargo', votes: [
{vote: 'good', count: 3},
{vote: 'bad', count: 1}
]}
到目前为止,我已经尝试过
{$group: {_id: {movieName: "$movie.name", vote: "$vote"}, count: {$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"}
}}
]
输出(用于您的示例文档):
{
"_id" : "fargo",
"good" : 3.0,
"bad" : 1.0
}
管道阶段的说明:
_id
和数字代表好的和坏 的票
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.