首页 文章

MongoDB嵌套组?

提问于
浏览
12

我正在尝试在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 } ... ]
 },
]

我的'inner group'如下所示,并将获得 all 类别的前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 }

我将如何实施“外部团体”?

另外,有时上面的聚合离子返回一个空值(并非所有文档都有一个术语值) . 我如何忽略空值?

提前致谢

1 回答

  • 17

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

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

    然后,第二个组将所有具有相同术语的文档合并为一个,使用$push运算符将类别合并到一个数组中:

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

相关问题