我有一组10,000个txt文件,其中包含旧的维基百科文章。
这些文章被加载到一个mongoDB集合中,使用自定义的Java程序。
每篇文章的文档如下:
现在我想计算数组中每个单词的出现次数,即所谓的词频。
生成的文档应该是这样的:
但是到目前为止,我所能够实现的就只有这样了:
但是你可以看到,文档结构并不符合我的需求。我只想要一次doc_id,然后是一个包含所有术语及其相应频率的数组。
所以我在寻找与 $unwind 操作相反的操作。
感谢您的帮助。
每篇文章的文档如下:
{
"_id" : ObjectID("....."),
"doc_id" : 335814,
"terms" :
[
"2012", "2012", "adam", "knick", "basketball", ....
]
}
现在我想计算数组中每个单词的出现次数,即所谓的词频。
生成的文档应该是这样的:
{
"doc_id" : 335814,
"term_tf": [
{term: "2012", tf: 2},
{term: "adam", tf: 1},
{term: "knick", tf: 1},
{term: "basketball", tf: 1},
.....
]
}
但是到目前为止,我所能够实现的就只有这样了:
db.stemmedTerms.aggregate([{$unwind: "$terms" }, {$group: {_id: {id: "$doc_id", term: "$terms"}, tf: {$sum : 1}}}], { allowDiskUse:true } );
{ "_id" : { "id" : 335814, "term" : "2012" }, "tf" : 2 }
{ "_id" : { "id" : 335814, "term" : "adam" }, "tf" : 1 }
{ "_id" : { "id" : 335814, "term" : "knick" }, "tf" : 1 }
{ "_id" : { "id" : 335814, "term" : "basketball" }, "tf" : 1 }
但是你可以看到,文档结构并不符合我的需求。我只想要一次doc_id,然后是一个包含所有术语及其相应频率的数组。
所以我在寻找与 $unwind 操作相反的操作。
感谢您的帮助。
$group
来将术语推回数组:https://docs.mongodb.org/manual/reference/operator/aggregation/push/ - Alex Blex$group
时,查询失败并显示以下错误信息:BufBuilder attempted to grow() to 134217728 bytes, past the 64MB limit.", "code" : 13548
我的聚合管道语句如下:db.stemmedTerms.aggregate([{$unwind: "$terms" }, {$group: {_id: {id: "$doc_id", term: "$terms"}, tf: {$sum : 1}}}, {$group: {_id: "$id", term_tf: {$push: {term: "$term", tf: "$tf"}}}}], {allowDiskUse:true});
- s1m0on