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. C#调用托管ocx、dll

    前篇文章是调用非托管,比较复杂,这里是调用托管,很简单[所以在遇到非托管dll时可以通过二次封装成托管的方式,再通过这边文章来使用] 1.注意这是基于COM的ocx或者dll,所以用regsvr32先 ...

  2. RSA加密解密中pkcs1与pkcs8格式私钥互相转换

    net,ios中rsa加解密使用的是pkcs1,而java使用的是pkcs8 如果是按1024取模(通常都是1024),pkcs1格式的私钥长度应该是812.如果是pkcs8的格式的密钥长度为861. ...

  3. 【ssh免登录】设置集群环境ssh免登录步骤

    1.每台机器都需要执行,生成自己的密钥 # ssh-keygen -t rsa 过程中遇到选项,全部enter #cd ~/.ssh # cat id_rsa.pub > authorized_ ...

  4. 【第十二章】 springboot + mongodb(复杂查询)

    简单查询:使用自定义的XxxRepository接口即可.(见 第十一章 springboot + mongodb(简单查询)) 复杂查询:使用MongoTemplate以及一些查询条件构建类(Bas ...

  5. ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer 最大生成树 lca

    大概就是要每两个点 只能有一条路径,并且约束,最短的边用来砌墙,那么反之的意思就是最大的边用来穿过 故最大生成树 生成以后 再用lca计算树上两点间的距离 (当然防止生成树是一条链,可以用树的重心作为 ...

  6. Pytorch版本yolov3源码阅读

    目录 Pytorch版本yolov3源码阅读 1. 阅读test.py 1.1 参数解读 1.2 data文件解析 1.3 cfg文件解析 1.4 根据cfg文件创建模块 1.5 YOLOLayer ...

  7. mui --- 怎么获取百度地图定位功能

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. Cocos2d-x学习笔记(十一)动作

    动作类Action是一切动作的祖先类.它有三个直接继承子类: FiniteTimeAction受时间限制的动作: Follow精灵跟随精灵的动作: Speed运动速度控制: 而FiniteTimeAc ...

  9. 已使用 163 邮箱测试通过,且支持 SSL 连接。 发送邮件

    示例:Jack 发送一封邮件给 Rose. public class SendMail {     public static void main(String[] args) {         b ...

  10. 利用Chrome的Heap Snapshot功能分析一个时间段内的内存占用率

    在下图测试代码第13行和第16行设断点. 以调试方式运行,首先断点在第13行处触发: 打开Chrome开发者工具,点击Profiles tab, 再点击按钮"Take Snapshot&qu ...