我的收藏如下:
<%= 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}} }
)
现在我想计算每个类别的文档数量,但文档版本是最新版本。
这是我被困的地方。
答案 0 :(得分:0)
您可以首先通过两个键(即categories
和version
字段对非规范化文档(来自 $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 } } }
)