最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

标签云在MongoDB和go中的实现

来源:动视网 责编:小采 时间:2020-11-09 13:32:18
文档

标签云在MongoDB和go中的实现

标签云在MongoDB和go中的实现:在关系数据库如mysql中标签云的实现是显而易见的,标签和blog分别在不同的表中,通过join可以比较简单的查询出标签的统计数据。 MongoDB为快速水平扩张以及性能而优化,在MongoDB中没有join,倾向于使用embedding来代替linking关系: General
推荐度:
导读标签云在MongoDB和go中的实现:在关系数据库如mysql中标签云的实现是显而易见的,标签和blog分别在不同的表中,通过join可以比较简单的查询出标签的统计数据。 MongoDB为快速水平扩张以及性能而优化,在MongoDB中没有join,倾向于使用embedding来代替linking关系: General


所以每个blog的标签应该是作为一个数组内嵌在blog记录中。那么就需要遍历所有的blog记录才能统计处所有tag的使用情况。 两种处理方式:

  1. 用一个额外的集合来保存tag的统计信息,所有涉及tag的操作都去更新这个集合。
  2. Schedule一个后台运行的job,定时运行mongodb的MapReduce操作来计算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中的实现

标签云在MongoDB和go中的实现:在关系数据库如mysql中标签云的实现是显而易见的,标签和blog分别在不同的表中,通过join可以比较简单的查询出标签的统计数据。 MongoDB为快速水平扩张以及性能而优化,在MongoDB中没有join,倾向于使用embedding来代替linking关系: General
推荐度:
标签: 标签 中的 实现
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top