Mongodb 聚合对象';嵌套数组出现次数计数

Mongodb 聚合对象';嵌套数组出现次数计数,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我正试图以这种方式聚合日志,这样我就可以计算出特定用户对关键字的偏爱程度。我提出了以下问题: db.a.aggregate([ {$unwind: "$keywords"}, {$group : {_id : {word : "$keywords", user : "$favorited_by"}, count : {$sum : 1}}} ]); 但它产生了产出: { "_id" : { "word" : "another", "user" : "too_creepy" },

我正试图以这种方式聚合日志,这样我就可以计算出特定用户对关键字的偏爱程度。我提出了以下问题:

db.a.aggregate([
    {$unwind: "$keywords"},
    {$group : {_id : {word : "$keywords", user : "$favorited_by"}, count : {$sum : 1}}}
]);
但它产生了产出:

{ "_id" : { "word" : "another", "user" : "too_creepy" }, "count" : 1 }
{ "_id" : { "word" : "test", "user" : "too_creepy" }, "count" : 2 }
虽然我想得到这样的东西:

输入 输出
如果可能的话,您知道如何编写此查询吗?

您可以通过向管道中添加第二个
$group
,然后添加最终的
$project
来重新调整输出:

db.a.aggregate([
{$unwind:“$KEYONS”},
{$group:{$id:{word:$keywords],用户:$favorited_by“},计数:{$sum:1}}},
//再次在just user上分组,并使用$push组合他们的关键字数组
{$group:{
_id:“$\u id.user”,
关键词:{$push:{关键词:'$\u id.word',计数:'$count'}
}},
//重塑输出
{$project:{favorited_by:'$_id',关键字:1,_id:0}
]);
输出:

{
“关键字”:[
{
“关键字”:“另一个”,
“计数”:1
}, 
{
“关键字”:“测试”,
“计数”:2
}
],
“受宠者”:“太令人毛骨悚然”
}, 
{
“关键字”:[
{
“关键字”:“测试”,
“计数”:1
}
],
“受宠者”:“你好,世界”
}
{
    _id: ObjectId("5475cf117ccee624583ba94a"),
    favorited_by: "too_creepy",
    keywords: [
        "test"
    ]
},
{
    _id: ObjectId("5475cf117ccee624583ba949"),
    favorited_by: "too_creepy",
    keywords: [
        "test"
    ]
},
{
    _id: ObjectId("5475cf117ccee624583ba949"),
    favorited_by: "too_creepy",
    keywords: [
        "anotherone"
    ]
},
{
    _id: ObjectId("5475cf117ccee624583ba09a"),
    favorited_by: "hello_world",
    keywords: [
        "test"
    ]
}
{
    favorited_by: "too_creepy",
    keywords: [
        {keyword: "test", count: 2},
        {keyword: "anotherone", count: 1}
    ]
},
{
    favorited_by: "hello_world",
    keywords: [
        {keyword: "test", count: 1}
    ]
}