按标记mongodb对文章分组计数

按标记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: {

我有很多文章都有一个名为tags的字段,是一个tags\u id数组,出于统计目的,我想计算每个tag有多少篇文章。如果标签是一个简单的标签id,这很容易,因为我可以按标签分组,但它是一个标签数组,我不能按该字段分组

首先,我尝试这样做:

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 }