我们的数据集具有以下结构:
{
'country': 'United States',
'text': 'twitter text string...'
},
{
'country': 'Australia',
'text': 'a different twitter text string...'
}
...
它包含来自大多数国家/地区的数据。目前有大约150万条目。我们的目标是使用聚合来获取每个国家/地区的文本字段中最常用的单词。使用$ project,$ group,$ split,$ unwind,$ nin(用于停用词)和$ sort的组合,我们已经设法接近了。它为我们提供了按国家/地区分隔的每个单词的计数,然后我们可以对其进行排序以获得最重要的单词。但是,我试图找出如何让它只为每个国家提供前N个单词。所以基本上计算每个国家的字数,排序,然后只返回每个国家的前N个。
我还是MongoDB查询的新手。我不一定在寻找一个完整的解决方案,但我想知道我应该在做什么查询参数和累加器来做这类事情。
答案 0 :(得分:1)
以下是聚合框架的解决方案:
db.collection.aggregate([
{
$project:{
country:1,
words:{
$split:[ "$text", " " ]
}
}
},
{
$unwind:"$words"
},
{
$group:{
_id:{
country:"$country",
word:"$words"
},
count:{
$sum:1
}
}
},
{
$match:{
"_id.word":{
$nin:[ "a" ]
}
}
},
{
$sort:{
count:-1
}
},
{
$group:{
_id:"$_id.country",
top_words:{
$push:"$_id.word"
}
}
},
{
$project:{
country:1,
top_words:{
$slice:[ "$top_words", 2 ]
}
}
}
])
$project
阶段country
和words
分组以获取每个国家/地区的每个单词的计数$match
阶段count
country
对文档进行分组,并将每个单词推送到名为top_words