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. goole机器学习视频链接【学习笔记】

    作者:庄泽彬 说明:在youtu上观看的google的机器学习相关的视频,如何fangqiang请自己解决 机器学习简介:https://www.youtube.com/watch?time_cont ...

  2. luogu3261 懒惰左偏树 [JLOI2015]城池攻占

    目录 题目 思路 错误&&反思 代码 题目 luogu 原来左偏树真的能懒惰下放 那这篇博客应该要咕咕了 一开始我按照那篇博客想了一下,感觉emm,还是瞄了一眼看到了pushdown ...

  3. hdu1866 A + B forever!(面积并)题解

    A + B forever! Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  4. java Request 获得用户IP地址

    public static String getIpAddress(HttpServletRequest request) { String ip = request.getHeader(" ...

  5. printf("%f\n",5);

    http://zhidao.baidu.com/link?url=87OGcxtDa6fQoeKmk1KylLu4eIBLJSh7CA3n5NWY-Ipm9TxZViFnIui307duCXWhaM0 ...

  6. BZOJ3297: [USACO2011 Open]forgot DP+字符串

    Description 发生了这么多,贝茜已经忘记了她cowtube密码.然而,她记得一些有用的信息.首先,她记得她的密码(记为变 量P)长度为L(1 <= L<=1,000)字符串,并可 ...

  7. gulp介绍及常用插件

    前端构建工具gulpjs的使用介绍及技巧 gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学习起来很容易,而且gulpjs使用的是nod ...

  8. 又见链表 --- 另一种Creat方式与反转

    链表 作为一种数据结构,链表以其方便的增删查改功能,实现了无数经典有用的程序. 在之前的帖子里,我构建链表的方式是建立一个不储存数据的head节点,然后通过一边输入数据一边建立结点的方式构建整个链表. ...

  9. django多对多中间表详解

    我们都知道对于ManyToMany字段,Django采用的是第三张中间表的方式.通过这第三张表,来关联ManyToMany的双方.下面我们根据一个具体的例子,详细解说中间表的使用. 一.默认中间表 首 ...

  10. Qt5.3.2openglVS2010_QSqlField_字段类型

    1.本来想通过 QSqlField::typeID() 来找字段类型,但是没找到... 然而看到了 SQL_INTEGER.SQL_SMALLINT等的使用(在“static QVariant::Ty ...