按标记mongodb对文章分组计数
我有很多文章都有一个名为tags的字段,是一个tags\u id数组,出于统计目的,我想计算每个tag有多少篇文章。如果标签是一个简单的标签id,这很容易,因为我可以按标签分组,但它是一个标签数组,我不能按该字段分组 首先,我尝试这样做:按标记mongodb对文章分组计数,mongodb,aggregate,Mongodb,Aggregate,我有很多文章都有一个名为tags的字段,是一个tags\u id数组,出于统计目的,我想计算每个tag有多少篇文章。如果标签是一个简单的标签id,这很容易,因为我可以按标签分组,但它是一个标签数组,我不能按该字段分组 首先,我尝试这样做: db.note.aggregate([{$match: { publishedAt: { $gte: ISODate('2018-01-01'), $lte: ISODate('2019-01-01') } }}, {$group: {
db.note.aggregate([{$match: {
publishedAt: {
$gte: ISODate('2018-01-01'),
$lte: ISODate('2019-01-01')
}
}}, {$group: {
_id: "$tags",
"total": {
"$sum": 1
}
}}, {$lookup: {
from: 'tags',
localField: '_id',
foreignField: '_id',
as: 'tag'
}}, {$unwind: {
path: "$tag"
}}, {$project: {
total: 1,
"tag.name": 1
}}, {$sort: {
total: -1
}}])
但这不起作用,那个查询,按标签分组,所以我尝试这样做:
{
'$match': {
'publishedAt': {
'$gte': new Date(req.body.gte),
'$lte': new Date(req.body.lte)
}
}
},
{
'$unwind': {
'path': '$tags'
}
}, {
'$group': {
'_id': '$tags',
'total': {
'$sum': 1
}
}
}, {
'$lookup': {
'from': 'tags',
'localField': '_id',
'foreignField': '_id',
'as': 'tag'
}
}, {
'$project': {
'total': 1,
'tag.name': 1
}
}, {
'$sort': {
'total': -1
}
},
{
'$unwind': {
'path': '$tag'
}
}
)
但问题是,该组用于数组中的第一个标记,而我错过了该数组中的所有其他标记
你认为解决办法是什么
我有很多文章都有一个名为tags的字段,是一个数组
标记ID,出于统计目的,我想计算有多少个
每个标签上都有我们的文章
您可以尝试此方法(我假设以下输入文档):
注:
标签:
查询: 输出:
{ _id: 1, name: "art-1", author: "ab", tags: [ "t1", "t2" ] },
{ _id: 2, name: "art-2", author: "cd", tags: [ "t1", "t3" ] },
{ _id: 3, name: "art-3", author: "wx", tags: [ "t4", "t3" ] },
{ _id: 4, name: "art-4", author: "yx", tags: [ "t1" ] }
{ _id: 1, id: "t1", name: "t1's name" },
{ _id: 2, id: "t2", name: "t2's name" },
{ _id: 3, id: "t3", name: "t3's name" },
{ _id: 4, id: "t4", name: "t4's name" }
db.tags.aggregate( [
{
$lookup: {
from: "notes",
localField: "id",
foreignField: "tags",
as: "tag_matches"
}
},
{ $project: { id: 1, name: 1, _id: 0, count: { $size: "$tag_matches" } } }
] )
{ "id" : "t1", "name" : "t1's name", "count" : 3 }
{ "id" : "t2", "name" : "t2's name", "count" : 1 }
{ "id" : "t3", "name" : "t3's name", "count" : 2 }
{ "id" : "t4", "name" : "t4's name", "count" : 1 }