热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golang中使用mongoDBObjectId

ObjectIdmongoDB中存储的文档必须有一个”_id”键,这个键的值可以是任何类型的,默认是ObjectId对象。在一个集合里面,每个文档都有唯一的”_id”值,来确保集合里面每个

ObjectId

mongoDB中存储的文档必须有一个”_id”键,这个键的值可以是任何类型的,默认是ObjectId对象。在一个集合里面,每个文档都有唯一的”_id”值,来确保集合里面每个文档都能被唯一标识。那么你可能会问,既然ObjectId的作用是用来标识文档,那为什么不用普通递增id呢?后文有解释。
这就需要了解MongoDB的特点,MongoDB是一个基于分布式文件存储的数据库。因此在高并发的场景下,自增id与MongoDB的设计背道而驰。在分布式环境中,自增id要保证正确递增必然会影响效率,因此MongoDB采用ObjectId作为对象标识。ObjectId是bson(binary json)类型的数据,由12位值组成:

  • 前4个字节表示时间戳,是文档创建时的时间,它是递增的,可以保证ObjectId总体递增的顺序。
    但是上面的递增不是绝对的,因为这个时间只是精确到秒,而同一台机器同一秒内生成的ObjectId还会因pid不同而不同,pid小的ObjectId始终排在pid大的那个前面。
  • 接着3位是机器识别码
    也就是在同一台机器中,每次生成ObjectId中,这三个字节总相等
  • 紧接2位着是进程id的值
  • 最后3位是随机值
    在机器、进程都确定的情况下,某一秒最多有2^24-1个对象,也就是16777215,从目前机器的性能来看,很难超过这个限制。

了解了这些,其实你自己就可以尝试动手写一个ObjectId生成器。下面看mgo包对其的支持。

ObjectId的生成

package main

import (
    "gopkg.in/mgo.v2/bson"
    "fmt"
)

func main(){
    //生成一个新的ObjectId值
    id := bson.NewObjectId()
    fmt.Println(id)
    //从ObjectId中获取时间戳
    idTime := id.Time()
    fmt.Println(idTime)
    //从ObjectId中获取机器码
    idMac := id.Machine()
    fmt.Println(idMac)
    //从ObjectId中获取进程id
    idPid := id.Pid()
    fmt.Println(idPid)
    //从OjbectId中获取随机数
    idCount := id.Counter()
    fmt.Println(idCount)
}

执行后的结果如下所示:

ObjectIdHex("5b0c01a2f2fad1839452c0e7")
2018-05-28 21:18:26 +0800 CST
[242 250 209]
33684
5423335

参考文章

  1. mongoDB修改”_id”的objectID到普通递增id为什么不好
  2. 关于ObjectId的问题总结

推荐阅读
  • 使用gin改写“SectionBuildingRESTfulAPIs”第三方包需要提前准备的包有:“gopkg.ingin-gonicgin.v1”“gopkg.inmgo.v2” ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 今天我们学习,数据库mongodb的使用,最下面有mongodb的下载链接。pipinstallpymongo首先安装pymongo,然后在需要用到的地方importpymongo ... [详细]
  • mongoDB高可用集群环境搭建
    2019独角兽企业重金招聘Python工程师标准在生产环境下,部署一台mongodb服务的话,会存在以下问题:单点问题生产环境是一个 ... [详细]
  • 前面刚有AWS开战MongoDB,双方“隔空互呛”,这厢又曝出2亿+简历信息泄露——MongoDB的这场开年似乎“充实”得过分了些。长期以来,作为“最受欢迎的NoSQL数据库”,M ... [详细]
  • 认真一点学 Go:18. 并发
    收录于《Go基础系列》,作者:潇洒哥老苗。>>原文链接学到什么并发与并行的区别?什么是Goroutine?什么是通道?Goroutine如何通信?相关函数的使用?sel ... [详细]
  • 按照之前我对map的理解,map中的数据应该是有序二叉树的存储顺序,正常的遍历也应该是有序的遍历和输出,但实际试了一下,却发现并非如此,网上查了下,发现从Go1开始,遍历的起始节点就是随机了,当然随机 ... [详细]
  • golang 解析磁力链为 torrent 相关的信息
    其实通过http请求已经获得了种子的信息了,但是传播存储种子好像是违法的,所以就存储些描述信息吧。之前python跑的太慢了。这个go并发不知道写的有没有问题?!packag ... [详细]
  • 目录在Go语言项目中使用Zap日志库介绍默认的GoLogger日志库实现GoLogger设置Logger使用LoggerLogger的运行GoLogger的优势和劣势优势劣势Ube ... [详细]
  • Go冒泡排序练习
    package main要求:随机生成5个元素的数组,并使用冒泡排序对其排序  从小到大思路分析:随机数用mathrand生成为了更好 ... [详细]
  • Go 快速入门指南命令行参数
    命令行参数个数调用os包即可。获取参数个数,遍历参数packagemainimport(fmtos)funcmain(){fmt.Printf(Numberofargsi ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • Allegro总结:1.防焊层(SolderMask):又称绿油层,PCB非布线层,用于制成丝网印板,将不需要焊接的地方涂上防焊剂.在防焊层上预留的焊盘大小要比实际的焊盘大一些,其差值一般 ... [详细]
author-avatar
gbn3312168
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有