MongoDB 中我们经常会接触到一个自动生成的字段:"_id",类型为ObjectId。

之前我们使用MySQL等关系型数据库时,主键都是设置成自增的。但在分布式环境下,这种方法就不可行了,会产生冲突。为此,mongodb采用了一个称之为ObjectId的类型来做主键。ObjectId是一个12字节的 BSON 类型字符串。按照字节顺序,一次代表:

4字节:UNIX时间戳 
3字节:表示运行MongoDB的机器 
2字节:表示生成此_id的进程 
3字节:由一个随机数开始的计数器生成的值

从ObjectId的构造上来看,内部就嵌入了时间类型。我们肯定可以从中获取时间信息:即插入此文档时的时间

a = new ObjectId()
ObjectId(“53102b43bf1044ed8b0ba36b”)
a.getTimestamp()
ISODate(“--28T06::59Z”)
根据时间构造ObjectId

上例是直接使用MongoDB提供的新建方法来构造ObjectId的,我们自己可不可以通过字符串来构造呢?看下例:

// 使用Date的字符串构造方法生成日期 
// 然后使用Date对象的getTime获取毫秒数,再除以1000得到标准时间戳

a = new Date(“-- ::”).getTime()/ 

// 获取时间戳的标准十六进制表示
a = a.toString()
50c75880

MongoDB默认在ObjectId上建立索引,是按照插入时间排序的。我们可以使用此索引进行查询和排序。

db.col.insert({“num”:})
db.col.insert({“num”:})
db.col.insert({“num”:})
db.col.find().pretty()
{ “_id” : ObjectId(“53102fb4bf1044ed8b0ba36c”), “num” : }
{ “_id” : ObjectId(“53102fb9bf1044ed8b0ba36d”), “num” : }
{ “_id” : ObjectId(“53102fbabf1044ed8b0ba36e”), “num” : }

// 按照_id升序,即按照插入时间升序

db.col.find().sort({“_id”:}).pretty()
{ “_id” : ObjectId(“53102fb4bf1044ed8b0ba36c”), “num” : }
{ “_id” : ObjectId(“53102fb9bf1044ed8b0ba36d”), “num” : }
{ “_id” : ObjectId(“53102fbabf1044ed8b0ba36e”), “num” : }

// 按照_id降序,即按照插入时间降序

db.col.find().sort({“_id”:-}).pretty()
{ “_id” : ObjectId(“53102fbabf1044ed8b0ba36e”), “num” : }
{ “_id” : ObjectId(“53102fb9bf1044ed8b0ba36d”), “num” : }
{ “_id” : ObjectId(“53102fb4bf1044ed8b0ba36c”), “num” : }

// 抽取num = 2的ObjectId用来过滤

num2 = ObjectId(“53102fb9bf1044ed8b0ba36d”)
ObjectId(“53102fb9bf1044ed8b0ba36d”)

// 找出插入时间在num2之后的数据

db.col.find({ “_id”:{$gt:num2}}).pretty()
{ “_id” : ObjectId(“53102fbabf1044ed8b0ba36e”), “num” : }

MongoDB中_id(ObjectId)生成的更多相关文章

  1. java 查询 mongodb 中的objectid

    网上找了很久查询objectid的方法都是错的,用mongovue能查询出来,但就是用java不知道怎么查询 1.mongovue里的查询方式: {"_id" : ObjectId ...

  2. 用nodejs删除mongodb中ObjectId类型数据

    mongodb中"_id"下面有个ObjectId类型的数据,想通过这个数据把整个对像删除,费了半天劲终于搞定费话少说上代码 module.exports = function ( ...

  3. MongoDB中的映射,限制记录和记录拼排序 文档的插入查询更新删除操作

    映射 在 MongoDB 中,映射(Projection)指的是只选择文档中的必要数据,而非全部数据.如果文档有 5 个字段,而你只需要显示 3 个,则只需选择 3 个字段即可. find() 方法 ...

  4. MongoDB中常用的find

    接着前一篇文章,下面主要介绍一下MongoDB中常用的find操作. 先打开MongoDB shell,通过下面一组命令插入一些数据. post1 = {} post2 = {} post3 = {} ...

  5. Spring中映射Mongodb中注解的解释

    spring-data-mongodb中的实体映射是通过MongoMappingConverter这个类实现的.它可以通过注释把java类转换为mongodb的文档. 它有以下几种注释: @Id - ...

  6. mongodb中的_id的ObjectId的生成规则

    MongoDB中存储的文档必须有一个"_id" .这个键值可以是任何类型,默认是ObjectID对象.在一个集合里,每个文档都有一个唯一的“_id”,确保集合里的每个文档都能被唯一 ...

  7. MongoDB中ObjectId的误区,以及引起的一系列问题

    近期对两个应用进行改造,在上线过程中出现一系列问题(其中一部分是由于ObjectId误区导致的) 先来了解下ObjectId: TimeStamp 前 4位是一个unix的时间戳,是一个int类别,我 ...

  8. MongoDB中的MapReduce介绍与使用

    一.简介 在用MongoDB查询返回的数据量很大的情况下,做一些比较复杂的统计和聚合操作做花费的时间很长的时候,可以用MongoDB中的MapReduce进行实现 MapReduce是个非常灵活和强大 ...

  9. Mongodb中 Documents文档说明

    mongodb使用BSON格式存储数据记录. 如下图: 文档结构 文档有键值对组成, 有以下结构: {    field1: value1,    field2: value2,    ...     ...

随机推荐

  1. win32 自定义右键菜单

    /**************************************************************************** 几大主要问题: 1.通过处理WM_MOUSE ...

  2. Linux虚拟内存和物理地址的理解【转】

    本文转载自:http://blog.csdn.net/dlutbrucezhang/article/details/9058583 在多任务操作系统中的每一个进程都运行在一个属于它自己的内存沙盘中.这 ...

  3. PyCharm/IDEA 使用技巧总结

    基本概念 IDEA 没有类似 Eclipse 的工作空间的概念(workspace),最大单元就是 Project.这里可以把 Project 理解为 Eclipse 中的 workspace.Mod ...

  4. 【第二十九章】 springboot + zipkin + mysql

    zipkin的数据存储可以存在4个地方: 内存(仅用于测试,数据不会持久化,zipkin-server关掉,数据就没有了) 这也是之前使用的 mysql 可能是最熟悉的方式 es Cassandra ...

  5. HDU 6143 Killer Names(容斥原理)

    http://acm.hdu.edu.cn/showproblem.php?pid=6143 题意: 用m个字母去取名字,名字分为前后两部分,各由n个字符组成,前后两部分不能出现相同字符,问合法的组成 ...

  6. hdu 5381 The sum of gcd 莫队+预处理

    The sum of gcd Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) P ...

  7. python 集合清空

    setp = set(["Red", "Green"]) setq = setp.copy() print(setq) setp.clear() print(s ...

  8. MAC下Java安装之后的路径

    pwd /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home 安装好jdk之后,就开始配置环境变量了. 首先,在终端输入 s ...

  9. ubuntu 常用设置

    ●1 问题:使用virt-manager创建虚拟机时,Virtual network 'default':NAT(Inactive) 解决方法:1,查看网络状态sudo virsh net-list ...

  10. Python 爬虫-Requests库入门

    2017-07-25 10:38:30 response = requests.get(url, params=None, **kwargs) url : 拟获取页面的url链接∙ params :  ...