2014-09-04 101 views
7

我想在MongoDB中实现一个嵌套的组查询,并且我试图添加外部组。鉴于下面(简化)的数据文件:MongoDB嵌套组?

{ 
    "timestamp" : ISODate(), 
    "category" : "movies", 
    "term" : "my movie" 
} 

我试图实现所有类别的列表,并在类别内应该有最多的条款数量。我想我的输出是这样的:

[ 
{ category: "movies", 
    terms: [ { term: "movie 1", total: 5000 }, { term: "movie 2", total: 200 } ... ] 
}, 
{ category: "sports", 
    terms: [ { term: "football 1", total: 4000 }, { term: "tennis 2", total: 250 } ... ] 
}, 
] 

我的“内部组”如下图所示,并且将获得最高5 所有类别:

db.collection.aggregate([ 
    { $match : { "timestamp": { $gt: ISODate("2014-08-27") } } }, 
    { $group : { _id : "$term", total : { $sum : 1 } } }, 
    { $sort : { total : -1 } }, 
    { $limit: 5 } 
]); 

// Outputs: 
{ "_id" : "movie 1", "total" : 943 } 
{ "_id" : "movie 2", "total" : 752 } 

我怎么会去实施“外部团体”?

此外,有时上述聚集]离子返回一个空值(并非所有文档都有一个术语值)。我如何去忽略空值?

在此先感谢

回答

12

在这种情况下,您将需要两组。第一组生成的文档的流与每术语和类别的一个文件:

{ $group : { 
     _id : { 
     category: "$category", 
     term: "$term", 
     }, 
     total: { $sum : 1 } 
    } 
} 

第二组将然后用相同的术语合并所有文件为一体,使用$push操作者合并的类别到一个数组:

{ $group : { 
     _id : "$_id.category", 
     terms: { 
      $push: { 
       term:"$_id.term", 
       total:"$total" 
      } 
     } 
    } 
} 
+1

谢谢!这已经解决了我的问题,我在两个组之间添加了“{$ sort:{total:-1}}”,以至于所有组合的术语都位于顶端,但我无法弄清楚如何限制术语每个类别说5个。在这些组之间添加“{$ limit:6}”不起作用。 (我试图做每个类别查询前5个术语)。谢谢! – clangers 2014-09-04 14:20:37