繁体   English   中英

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

[英]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
}

管道阶段的说明:

  1. 项目:使用移动作为名称_id和数字代表好的
  2. 小组:对每部电影分别计票

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM