MongoDB -分组和计数值,但将每条记录视为一条



我想按follow_user.tags.tag_id分组并计数每条记录,所以无论相同的tag_id在同一条记录上出现多少次,它只算作1。

我的数据库结构是这样的:

{ 
"external_userid" : "EXID1", 
"follow_user" : [
{
"userid" : "USERID1", 
"tags" : [
{
"tag_id" : "TAG1"
}
]
}, 
{
"userid" : "USERID2", 
"tags" : [
{
"tag_id" : "TAG1"
},
{
"tag_id" : "TAG2"
}
]
}
]
},
{ 
"external_userid" : "EXID2", 
"follow_user" : [
{
"userid" : "USERID1", 
"tags" : [
{
"tag_id" : "TAG2"
}
]
}
]
}

这是我的查询:

[
{ "$unwind": "$follow_user" }, { "$unwind": "$follow_user.tags" },
{ "$group" : { "_id" : { "follow_user᎐tags᎐tag_id" : "$follow_user.tags.tag_id" }, "COUNT(_id)" : { "$sum" : 1 } } },
{ "$project" : { "total" : "$COUNT(_id)", "tagId" : "$_id.follow_user᎐tags᎐tag_id", "_id" : 0 } } 
]

我所期望的:

{ 
"total" : 1, 
"tagId" : "TAG1"
},
{ 
"total" : 2, 
"tagId" : "TAG2"
}

结果:

{ 
"total" : 2, 
"tagId" : "TAG1"
},
{ 
"total" : 2, 
"tagId" : "TAG2"
}
  1. $set-新建字段follow_user_tags

    1.1。$setUnion-将值与Result1.1.1.

    区分开来。1.1.1。$reduce-将follow_user.tags.tag_id的值添加到数组中。

  2. $unwind-解构follow_user_tags数组字段到多个文档。

  3. $group-通过follow_user_tags分组,通过$sum进行总计数。

  4. $project-装饰输出文件。

db.collection.aggregate([
{
$set: {
follow_user_tags: {
$setUnion: {
"$reduce": {
"input": "$follow_user.tags",
"initialValue": [],
"in": {
"$concatArrays": [
"$$value",
"$$this.tag_id"
]
}
}
}
}
}
},
{
$unwind: "$follow_user_tags"
},
{
$group: {
_id: "$follow_user_tags",
total: {
$sum: 1
}
}
},
{
$project: {
_id: 0,
tagId: "$_id",
total: 1
}
}
])

Mongo Playground示例

最新更新