计算按标签分组的文章mongodb

时间:2019-11-17 22:33:47

标签: mongodb aggregate

我有很多文章都有一个称为标签的字段,并且是标签_id的数组,出于统计目的,我想计算每个标签有多少篇文章。如果标记是一个简单的标记_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'
                }
              }
            )

但是问题是,该组是数组中第一个标签,而我错过了该数组中的所有其他标签。

您认为解决方案是什么?

1 个答案:

答案 0 :(得分:1)

  

我有很多文章都带有标签字段,并且是由   标签_ids,出于统计目的,我想计算多少   每个标签都有的文章。

您可以尝试执行此操作(我假设使用以下输入文档):

注释:

{ _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 }