所以每个blog的标签应该是作为一个数组内嵌在blog记录中。那么就需要遍历所有的blog记录才能统计处所有tag的使用情况。 两种处理方式:
第二种方式:
job := mgo.MapReduce { Map: "function(){if(!this.tags) return; for(i in this.tags){emit(this.tags[i],1);}}", Reduce: "function(key, values) {var sum = 0; for(i in values){sum = sum + values[i];} return sum;}", Out: bson.M{"replace":"tags"}, } func CollectTags() { c := session.DB(DB).C("blog") _,err:= c.Find(nil).MapReduce(job, nil) if err!= nil { //TODO: better logger fmt.Println(err) } time.AfterFunc(MapReduceInterval, CollectTags) } func main() { go CollectTags() //Other... }
有了数据,tag云的生成就比较简单了,这里用的是wikipedia上介绍的计算公式:
template:
{{if .}} {{range $tag, $size := .}} {{$tag}} {{end}} {{end}}
最大字体选择28,最终效果即如主页所示。
原文地址:标签云在MongoDB和go中的实现, 感谢原作者分享。