设为首页 收藏本站
查看: 1252|回复: 0

[经验分享] mongodb 踩坑记录

[复制链接]

尚未签到

发表于 2015-7-6 10:06:01 | 显示全部楼层 |阅读模式
Map-Reduce
  Map-Reduce 是 mongodb 处理批量数据的大杀器,凡是数据量大并且定时处理能满足需求的,都可以试着扔给 mongodb,让它去 Map-Reduce。
  以下截取自文档的图,可以清楚的说明 Map-Reduce 的执行过程。先看图:
DSC0000.png
  回答问题,Map-Reduce 的执行过程是先 map 然后 reduce 么?
  是?恭喜入坑!而且是自己挖坑自己填。仔细再看一遍上文的图,看到那个灰色的箭头了?不是每次 map 都有 reduce 的!
  如果 map 的结果不是数组,mongodb 就不会执行 reduce。很合理的处理逻辑。
  然后,只有入过坑才能意识到自己挖的坑:对于 map 到的数据,如果在 reduce 时希望做统一的处理,一定会发现数据结果是不完整的。

mgo 时间
  mgo 是 golang 的 mongodb driver。
  首先,构建测试程序。
  

package main  

  
import (
  "log"
  "time"
  

  "gopkg.in/mgo.v2"
  . "gopkg.in/mgo.v2/bson"
  
)
  

  
type TestTime struct {
  Id           ObjectId "_id"
  CreationTime time.Time
  
}
  

  
func main() {
  session, err := mgo.Dial("127.0.0.1")
  if err != nil {
  log.Fatalln("Fatal error:", err.Error())
  }
  

  defer session.LogoutAll()
  defer session.Close()
  

  tc := session.DB("test").C("testtime")
  

  t := time.Now()
  id := NewObjectId()
  

  test := TestTime{

  Id:          >  CreationTime: t,
  }
  

  tc.Insert(test)
  

  var testTime TestTime
  tc.FindId(id).One(&testTime)
  

  log.Println(t)
  

  log.Println(t == testTime.CreationTime)
  
}
  

UTC
  执行测试程序,查看 mongodb 数据
  

/* 0 */  
{
  "_id" : ObjectId("548d0b3194e33700f5ffaba9"),
  "creationtime" : ISODate("2014-12-14T03:59:45.123Z")
  
}
  

  时间已经是 UTC 了,没有必要 time.Now().UTC(),当然,执行下 .UTC() 代码看起来更明确,也耗费不了多少 CPU,因为,.UTC() 仅仅是赋值时间的 location,其源码如下:
  

func (t Time) UTC() Time{  t.loc = UTC
  return t
  
}
  

精度
  mgo 直接以 time.Time 类型插入 mongodb 的时间精度与 time.Now() 的时间精度是不同的:


  • mgo 精度为 ms  

  • time.Now() 精度为 ns,2014-12-14 11:59:45.123670247 +0800 CST
  所以,上文 log.Println(t == testTime.CreationTime) 打印结果是 false

_id 索引
  _id 是 mongodb 每个文档必备字段,而且是默认索引,就是说不管你用不用,它都会建立索引并占用存储空间。
  在设计存储结构时,只要能保证唯一性,即可将其作为 _id,例如:
  

{  "_id" : {
  "nickname" : "busyStone",
  "index" : 1
  },
  "creationtime" : ISODate("2014-11-09T02:00:44.496Z")
  
}
  

  mongodb 是支持组合索引的,那么,_id.nickname 是不是也可以作为索引用呢?
  在选中的 collection 上执行 .find({"id.nickname":"busyStone"}).explain(),nscanned 字段并不是预想中的 1,因为,建立的索引是这样的:
  

{  "_id" : 1
  
}
  

  所以,老老实实自己个建索引吧。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-83733-1-1.html 上篇帖子: MongoDB源码概述——启动处理 下篇帖子: MongoDB查询语法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表