mongodb 踩坑记录
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()
精度为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
}
所以,老老实实自己个建索引吧。
mongodb 踩坑记录的更多相关文章
- unionId突然不能获取的踩坑记录
昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://m ...
- CentOS7.4安装MySQL踩坑记录
CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...
- ubuntu 下安装docker 踩坑记录
ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...
- SpringBoot + Shiro + shiro.ini 的踩坑记录
0.写在前面的话 好久没写博客了,诶,好多时候偷懒直接就抓网上的资料丢笔记里了,也就没有自己提炼,偷懒偷懒.然后最近参加了一个网络课程,要交作业的那种,为了能方便看下其他同学的作业,就写了个爬虫把作业 ...
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- google nmt 实验踩坑记录
最近因为要做一个title压缩的任务,所以调研了一些text summary的方法. text summary 一般分为抽取式和生成式两种.前者一般是从原始的文本中抽取出重要的word o ...
- ABP框架踩坑记录
ABP框架踩坑记录 ASP.NET Boilerplate是一个专用于现代Web应用程序的通用应用程序框架. 它使用了你已经熟悉的工具,并根据它们实现最佳实践. 文章目录 使用MySQL 配置User ...
- SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录
Spring boot +Spring Security + Thymeleaf认证失败返回错误信息踩坑记录 步入8102年,现在企业开发追求快速,Springboot以多种优秀特性引领潮流,在众多使 ...
- IDFA踩坑记录
IDFA踩坑记录: 1.iOS10.0 以下,即使打开“限制广告跟踪”,依然可以读取idfa: 2.打开“限制广告跟踪”,然后再关闭“限制广告跟踪”,idfa会改变: 3.越狱机器安装开发证书打的包, ...
随机推荐
- python访问网站
#!/usr/bin/env python # encoding: utf-8 from functools import wraps import requests from lxml import ...
- 2.jinja2
1.jinja2模板介绍和查找路径 from flask import Flask, render_template import os # 之前提到过在渲染模板的时候,默认会从项目根目录下的temp ...
- vue—你必须知道的
更多总结 猛戳这里 属性与方法 不要在实例属性或者回调函数中(例如,vm.$watch('a', newVal => this.myMethod())使用箭头函数.因为箭头函数会绑定父级上下文, ...
- python笔记-邮件发送(smtplib)【转载】
本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/python/ 前言 本篇总结了QQ邮箱和163邮箱发送邮件,邮件包含html中文和附件 ...
- eps图片中有中文乱码的问题
一般的,如果matlab中的fig图片中有中文,直接saveas为eps,eps再插入latex后会出现乱码. 解决的办法为: (1) *.fig利用‘file--print’保存为*.pdf (2) ...
- (三)mysql数据库基本操作
(1)SQL语句:结构化查询语句 DDL语句 数据定义语言:数据库丶表丶视图丶索引丶存储过程丶函数丶create drop alter DML语句 数据库操作语言:插入数据insert,删除数据del ...
- 使用base64对图片的二进制进行编码,使其可以利用ajax进行显示
有时候我们需要动态的将图片的二进制在页面上进行显示,如我们需要弄一个验证码的功能,那么如果我们的验证码的图片在后台得到的是该图片的二进制,那么当我们需要在页面上点击一个按钮利用ajax进行切换的时候, ...
- NYOJ 914 Yougth的最大化【二分/最大化平均值模板/01分数规划】
914-Yougth的最大化 内存限制:64MB 时间限制:1000ms 特判: No 通过数:3 提交数:4 难度:4 题目描述: Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从 ...
- POJ 3553 Task schedule【拓扑排序 + 优先队列 / 贪心】
Task schedule Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 515 Accepted: 309 Special J ...
- Codeforces Round #424 B. Keyboard Layouts(字符串,匹配,map)
#include <stdio.h> #include <string.h> ][]; ]; ]; int main(){ scanf(]); scanf(]); scanf( ...