一、OBJECTID

因公司开发人员在使用MONGODB时,总遇到一些小问题。为了增加大家的mongodb 数据库知识。
决定每周进行一、两次的知识小课堂。这里把内容整理出来,上传到博客中。也算是自己的一个mongodb 历程吧

1.1 结构

ObjectId("52cbab42231dea1e819b2a37"),
ObjectId("52cbab5b231dea1e819b2a38"),
ObjectId("52cbab70231dea1e819b2a39"),

52cbab70      时间戳
231dea        机器号
1e81        进程ID
9b2a39    自增数

以上数字为 16进制表示

特点:

1.24个16进制数据,使用 12字节的存储空间。

2.最后3个字节为:自动增长。可确保每秒生成的值也不一样,一秒最多允许每个进程拥有256^3个不同ObjectId

(后面3位16进制存在量可以达到: 16,777,216
也可以从存储量计算出来 FFFFFF 转换成10进制就是16,777,215)

3.可转移到客户端生成,而减轻服务器负担(需要客户端的驱动程序)

下面介绍几个相关的函数

>> x=ObjectId()
ObjectId("53b3a89bf988c39955a30f9e")
> x
ObjectId("53b3a89bf988c39955a30f9e")
>x.str
53b3a89bf988c39955a30f9e> x.toString()
ObjectId("53b3a89bf988c39955a30f9e")
> x.getTimestamp()
ISODate("2014-07-02T06:37:15Z")
> x.valueOf()
53b3a89bf988c39955a30f9e
>

函数说明:

1.Str 功能 与valueOf()相同

2.toString()  把一个对象转换成

了一字串。这时两个objectId可以对比。

3.getTimestamp() 抽取 时间

我们再来看看一个有意思的查询:

既然可以把从objectId 获取日期,那我是否可以使用一个日期做为条件,使用_id 字段来进行查询呢。

我的方法是

 使用 函数  getTimestamp()先把字段 进行处理,这在一般的关系型数据库非常常用。
<span style="font-size:18px;">> a = db.order.findOne()
{"_id" : ObjectId("5331128631a4804b226471e4"),"md5" : "cacae8722c325d62e795e5c273d5f49b",……
}
> a."_id"
Wed Jul  2 14:50:57.494 SyntaxError: Unexpected string
> a._id.getTimestamp()
ISODate("2014-03-25T05:22:14Z")
> new Date("2014,03,25")
ISODate("2014-03-24T16:00:00Z")
> new Date("2014,03,25")
ISODate("2014-03-24T16:00:00Z")
> db.order.find({"_id.getTimestamp()":{$gt:new Date("2014,03,25")}}).count()
0
> db.order.find({_id.getTimestamp():{$gt:new Date("2014,03,25")}}).count()
Wed Jul  2 14:54:00.298 SyntaxError: Unexpected token .
> </span>

可以看到,看来是行不通。mongodb 无法识别 处理后的字段。

那只能自己生成一个objectId 再进行对比了。

我以前一直以为是无法进行两个 objectId 来进行对比的。

但查询了官方资料。并没有看到相关按时间生成新的objectID 的方法/函数。

(http://docs.mongodb.org/manual/reference/method/)

后来找到了开发牛人的一个便方,解决了此问题。代码如下:

<span style="font-size:18px;">#构建一个指定日期的objectId()
> var timestamp = Math.floor(new Date(2014,03,01).getTime() / 1000);  #getTime() 返回毫秒数
> var hex       = (‘00000000’ + timestamp.toString(16)).substr(-8); #前填充0
> var v_objectId  = new ObjectId(hex + new ObjectId().str.substring(8)); #更换掉前面的时间值
</span>

其它方法也比较简单,就是把一个日期转换成16进制后,替换到一个新生成的objectId 中去。

当自己构造好一个objectId后,后面我们来使用它进行查询:

<span style="font-size:18px;">#用objectId() 来进行对比查询
> db.order.find({_id:{$gt:v_objectId}})
{ "_id" : ObjectId("533e1049e4271af009000005"), "md5" : "a99038f392284b7dac895dc0030486c8",
...}
</span>

可以看到,查询结果出来了。从上面可以看出。两个objectId 是可以进行对比的。

从上面示例代码看到

虽然可以从ojbectId 中提取一些信息。但如果要使用 objectid中的信息来做为查询条件,相对还是比较麻烦的。

就象我上面的,如果我要从objectID 的建立日期 来做为查询条件,我自己得先用查询时间构建一个objectID,然后再进行查询。

如果查询条件还有范围什么的。还不如再建立一个字段create_dt 来保存记录的建立时间。以后查询统计用此字段,还更方便。

我们再来看看查询的计划,看到已使用了索引,此计划虽然不能说明什么。但也可以让我知道是用_id 字段的索引。

<span style="font-size:18px;">> db.order.find({_id:{$gt:v_objectId}}).explain()
{"cursor" : "BtreeCursor _id_","isMultiKey" : false,"n" : 3,"nscannedObjects" : 3,"nscanned" : 3,"nscannedObjectsAllPlans" : 3,"nscannedAllPlans" : 3,"scanAndOrder" : false,"indexOnly" : false,"nYields" : 0,"nChunkSkips" : 0,"millis" : 0,"indexBounds" : {"_id" : [[ObjectId("533991005c1e4132ccbaf755"),ObjectId("ffffffffffffffffffffffff")]]},"server" : "localhost.localdomain:27017"
}
> </span>

【知识小课堂】 mongodb 之 objectId相关推荐

  1. 宝付国际跨境知识小课堂 | 人民币外汇市场是个啥?

    全球化浪潮下,因为各个经济体的比较利益差异,产生了货物.服务.人员或资本之间的流动.各个经济体使用的当地货币不同,为了贸易或资本流动及其价值定价,本国的货币需要兑换成另一国的货币来结算,这个货币兑换的 ...

  2. 【知识小课堂】mongodb 之 查询关键词使用

    查询关键词: $or 多个条件 满足其中一个 即可: Syntax:{ $or: [ { <expression1> }, { <expression2> }, ... , { ...

  3. 【知识小课堂】mongodb 之 特殊集合及索引

    1.固定集合 一般的集合都是动态的,可以自动增长以容纳越来越多的数据. 但MONGODB 还有另外一种集合:固定集合.集合大小创建时指定.如果没有空间了,就会自动删除最老的文档,以释放空间.(类似以一 ...

  4. 【知识小课堂】 mongodb 之字段中的【 数组】、【内嵌文档】

    一.介绍 MONGODB 的表结构 很灵活 .主要还是因为 字段中可以包含 [ 数组].[内嵌文档]. 现在简单介绍一下 字段中的[ 数组].[内嵌文档]相关的一些操作 (为了方便理解,还是以表来理解 ...

  5. 计算机知识小课堂宣传标语,创建高效课堂宣传标语50条

    创建高效课堂宣传标语50条 在日常学习.工作或生活中,大家都接触过很多优秀的标语吧,标语是指文字简练.意义鲜明的宣传.鼓动口号.那什么样的标语才算得上是经典呢?以下是小编精心整理的创建高效课堂宣传标语 ...

  6. 家电知识小课堂 帮您避过选购的那些坑

    本文来自IT168 大家在选购家电时,是否会或多或少拥有一些困惑呢?面对琳琅满目的众多产品,不知道该如何选择,甚至一不小心就可能陷入某些选购陷阱之中,多花了冤枉钱.下面我们就来为大家普及一些家电选购的 ...

  7. 模具制造设计知识小课堂

    "潇洒模具"--模具制造设计培训讲堂: 一,选择模具钢时什么是最重要的和最具有决定性意义的因素? 成形方法:可从两种基本材料类型中选择. A) 热加工工具钢,它能承受模铸.锻造和挤 ...

  8. 【知识小课堂】 之 聚合函数

    我们先来看几个简单的聚合命令: 1.count > db.foo.count() 4 > db.foo.find({_id:{$gte:2}}) { "_id" : 2 ...

  9. 【知识小课堂】4 之 索引

    索引类型 mongoDB 的索引在存储结构都是一样的,但是根据不同的应用需求,还是分成了:唯一索引,稀疏索引,复合索引 1.唯一索引 MONGODB 在默认建立文档时,都会自动添加一个:"_ ...

最新文章

  1. java 线程 thread.join_java线程Thread的join方法。
  2. 可以把阿里云上面的一些介绍和视频都看看
  3. javascript与jQuery对照学习总结(一)(一些常规操作)
  4. python 编程一日一练-Python每日一练0013
  5. 从源码的角度说说Activity的setContentView的原理(二)
  6. 文件fluent_Win10 中解决FLUENT中UDF 的方法
  7. 大数据_Flink_数据处理_命令行提交Job---Flink工作笔记0014
  8. 团队开发——用户需求报告
  9. maple 假设_Maple教程-第5章解方程讲解上
  10. html表格收起展开,vue-table-element表格的全部展开和全部折叠
  11. 如何管理好一个团队 怎样管理好一个团队 如何带领一个团队
  12. 使用sort(function(a,b){return a-b})对数组进行排序的原理
  13. php mb_eregi_replace 只替换一个,php正则ereg ereg_replace eregi eregi_replace split
  14. LabVIEW树形控件
  15. 华为设备,什么是MAC地址漂移
  16. cocos2d实现语音_【Cocos Creator与C++知识分享】Creator接入呀呀语音SDK
  17. iOS开发:xcode无法选择设备和corner stone如何过滤上传文件
  18. 四川一度智信|小白卖家不懂选品?
  19. vue props命名为啥使用kebab-case (短横线隔开式) 来命名
  20. CBoard BI 数据可视化 支持国产开源

热门文章

  1. Oracle中NUMBER类型如果不指定长度和小数点精度默认是多长
  2. 为您的软件系统设计选择最佳的工具
  3. MySQL技术内幕读书笔记(一)——Mysql体系结构和存储引擎
  4. python3 爬虫4--解析链接
  5. Ajax中有关readyState(状态值)和status(状态码)的问题
  6. 进击的UI------------------UISegmentedControlUISlide
  7. 如何在Access中参数化日期类型,以解决Data type mismatch in criteria expression的问题...
  8. 测试Windows Live Writer对cnBlog的支持
  9. Android高级模糊技术RenderScript和FastBlur
  10. linux简单文件管理命令的使用