Map-Reduce

Map-Reduce 是 mongodb 处理批量数据的大杀器,凡是数据量大并且定时处理能满足需求的,都可以试着扔给 mongodb,让它去 Map-Reduce。

以下截取自文档的图,可以清楚的说明 Map-Reduce 的执行过程。先看图:

回答问题,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: 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() 精度为 ns2014-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
}

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

mongodb 踩坑记录的更多相关文章

  1. unionId突然不能获取的踩坑记录

    昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://m ...

  2. CentOS7.4安装MySQL踩坑记录

    CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...

  3. ubuntu 下安装docker 踩坑记录

    ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...

  4. SpringBoot + Shiro + shiro.ini 的踩坑记录

    0.写在前面的话 好久没写博客了,诶,好多时候偷懒直接就抓网上的资料丢笔记里了,也就没有自己提炼,偷懒偷懒.然后最近参加了一个网络课程,要交作业的那种,为了能方便看下其他同学的作业,就写了个爬虫把作业 ...

  5. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  6. google nmt 实验踩坑记录

       最近因为要做一个title压缩的任务,所以调研了一些text summary的方法.    text summary 一般分为抽取式和生成式两种.前者一般是从原始的文本中抽取出重要的word o ...

  7. ABP框架踩坑记录

    ABP框架踩坑记录 ASP.NET Boilerplate是一个专用于现代Web应用程序的通用应用程序框架. 它使用了你已经熟悉的工具,并根据它们实现最佳实践. 文章目录 使用MySQL 配置User ...

  8. SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

    Spring boot +Spring Security + Thymeleaf认证失败返回错误信息踩坑记录 步入8102年,现在企业开发追求快速,Springboot以多种优秀特性引领潮流,在众多使 ...

  9. IDFA踩坑记录

    IDFA踩坑记录: 1.iOS10.0 以下,即使打开“限制广告跟踪”,依然可以读取idfa: 2.打开“限制广告跟踪”,然后再关闭“限制广告跟踪”,idfa会改变: 3.越狱机器安装开发证书打的包, ...

随机推荐

  1. git放弃本地commit,未push

    如果不小心commit了一个不应该commit的修改,但是还没有push,想撤销那个commit. 步骤: a) git log:获取commit id: b) git reset --hard co ...

  2. Chubby lock service for distributed system

    Chubby lock service在分布式系统中的应用 Chubby lock service在分布式系统中提供粗粒度的锁服务, 以及可靠的存储. 相比高性能, 设计的重点在于高可靠性和高可用性. ...

  3. python--celery

    有些时候我们的一些任务比较耗时,比如我们写了一个网站,用户注册的时候需要发送邮件.但是发送邮件的过程比较耗时,用户必须要等到我们将邮件发送成功之后才会得到响应.那么有没有一种办法,当用户点击发送邮件的 ...

  4. 使用WindowManager添加View——悬浮窗口的基本原理

    Android系统中的“窗口”类型虽然很多,但只有两大类是经常使用的:一是由系统进程管理的,称之为“系统窗口”:第二个就是由应用程序产生的,用于显示UI界面的“应用窗口”.如果大家熟悉WindowMa ...

  5. Selenium2+python自动化66-装饰器之运行失败截图【转载】

    前言 对于用例失败截图,很多小伙伴都希望在用例执行失败的时候能自动截图,想法是很好的,实现起来并不是那么容易. 这里分享下我的一些思路,当然目前还没找到完美的解决方案,我的思路是用装饰器去解决,希望有 ...

  6. Selenium2+python自动化20-Excel数据参数化【转载】

    前言 问: Python 获取到Excel一列值后怎么用selenium录制的脚本中参数化,比如对登录用户名和密码如何做参数化? 答:可以使用xlrd读取Excel的内容进行参数化.当然为了便于各位小 ...

  7. ionic3 打包发布,以安卓说明

    1 添加图标 ionic cordova resources [<platform>] 官方https://ionicframework.com/docs/cli/cordova/reso ...

  8. [BZOJ1076][SCOI2008]奖励关 状压dp

    1076: [SCOI2008]奖励关 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3070  Solved: 1595[Submit][Statu ...

  9. Python爬虫Scrapy测试

    # -*- coding:utf- -*- import urllib import urllib2 import re import thread import time #糗事百科爬虫类 clas ...

  10. scrapy 工作流程

    Scrapy的整个数据处理流程由Scrapy引擎进行控制,其主要的运行方式为: 引擎打开一个域名,蜘蛛处理这个域名,然后获取第一个待爬取的URL. 引擎从蜘蛛那获取第一个需要爬取的URL,然后作为请求 ...