我有以下格式的许多文件
{
_id:...,
words:["usa","canda","america", "colon"],
owner:23
}
{
_id:...,
words:["chile","peru","argentina","america", "colon"],
owner:23
}
{
_id:...,
words:["colon", "america", "britain", "mexico", "usa"],
owner:23
}
所以,我需要所有者23
的关键字云:
[
{name:"america", hits:3},
{name:"colon", hits:3},
{name:"usa", hits:2},
{name:"britain", hits:1},
{...}
]
我的问题是我无法得到我想要的东西。 我怎么能得到? 感谢
答案 0 :(得分:1)
使用 aggregation framework ,它会为您提供所需内容。聚合管道应该使用 $match
运算符作为第一步筛选值{23的owner
键上的输入文档。
第二个管道步骤是 $unwind
运算符,它从输入文档解构words
数组字段,并为下一个流输出每个元素的文档。每个输出文档都使用元素值替换数组。
为您提供关键字计数的管道阶段是 $group
运算符,它通过word
键对上一个流中的输入文档进行分组,并应用累加器表达式 $sum
,返回每个组的总和。
最后一步, $project
运算符通过添加新字段name
来重新整形流中的每个文档,该字段替换上一个流中的_id
密钥。
最后,您的聚合管道将如下所示:
db.collection.aggregate([
{
"$match": { "owner": 23 }
},
{
"$unwind": "$words"
},
{
"$group": {
"_id": "$words",
"hits": {
"$sum": 1
}
}
},
{
"$project": {
"_id": 0, "name": "$_id", "hits": 1
}
}
])