mongodb计算每个类别的文档数量

时间:2016-05-27 11:35:10

标签: mongodb

我的收藏如下:

<%= link_to 'Destroy', admin_item_asset_path( @item.id, @asset.id ), method: :delete, data: { confirm: 'Are you sure?' } %>

我想计算每个类别的文档数量。为此,我展开了类别数组:

   {  
   "_id":ObjectId("5744b6cd9c408cea15964d18"),
   "uuid":"bbde4bba-062b-4024-9bb0-8b12656afa7e",
   "version":1,
   "categories":["sport"]
   }, 
   {
   "_id":ObjectId("5745d2bab047379469e10e27"),
   "uuid":"bbde4bba-062b-4024-9bb0-8b12656afa7e",
   "version":2,
   "categories":["sport", "shopping"]
   },
   {
   "_id":ObjectId("5744b6359c408cea15964d15"),
   "uuid":"561c3705-ba6d-432b-98fb-254483fcbefa",
   "version":1,
   "categories":["politics"]
   }

结果:

db.collection.aggregate( 
 {$unwind: '$categories'}, 
 {$group: {_id: '$categories', count: {$sum: 1}} } 
)

现在我想计算每个类别的文档数量,但文档版本是最新版本。

这是我被困的地方。

2 个答案:

答案 0 :(得分:0)

您可以首先通过两个键(即categoriesversion字段对非规范化文档(来自 $unwind 运算符步骤)进行分组。这对于前面的管道步骤是必要的,该步骤分别使用 $sort 运算符按版本(desc)和类别(asc)键对分组文档及其累计计数进行排序。

使用 $first 运算符进行排序后,需要使用其他分组来获取每个categories组中的热门文档。以下显示了这个

db.collection.aggregate( 
    { "$unwind": "$categories" },
    {
        "$group": {
            "_id": {
                'categories': '$categories',
                'version': '$version'               
            }, 
            "count": { "$sum": 1 }
        } 
    },
    { "$sort": { "_id.version": -1, "_id.categories": 1 } },
    {
        "$group": {
            "_id": "$_id.categories",
            "count": { "$first": "$count" },
            "version": { "$first": "$_id.version" }         
        }
    }
)

示例输出

{ "_id" : "shopping",  "count" : 1, "version" : 2 }
{ "_id" : "sport", "count" : 1, "version" : 2 }
{ "_id" : "politics", "count" : 1, "version" : 1 }

答案 1 :(得分:0)

这很丑陋,但我认为这会让你得到你想要的东西:

db.collection.aggregate( 
 { $unwind : "$categories" },
 { $group : 
   { "_id" : { "uuid" : "$uuid" },
     "doc" : { $push : { "version" : "$version", "category" : "$categories" } },
     "maxVersion" : { $max : "$version" } 
   }
 },
 { $unwind : "$doc" },
 { $project : { "_id" : 0, "uuid" : "$id.uuid", "category" : "$doc.category", "isCurrentVersion" : { $eq : [ "$doc.version", "$maxVersion" ] } } },
 { $match : { "isCurrentVersion" : true }},
 { $group : { "_id" : "$category", "count" : { $sum : 1 } } }
)