mongodb 主键_MongoDB主键是您的朋友

mongodb 主键

MongoDB集合中的所有文档都有一个主键,称为_id 。 该字段在插入后自动分配给文档,因此几乎不需要提供它。 _id字段有趣的是,它是基于时间的 。 也就是说, _id的基础类型为ObjectId ,是12字节的BSON类型 ,其中的4个字节表示自Unix时代以来的秒数。

_id字段的特殊之处在于,它会通过在任何集合上调用getIndexes来自动建立索引,如下所示。

所有MongoDB集合都有一个_id字段作为索引:

> db.things.getIndexes()
[{"v" : 1,"key" : {"_id" : 1},"ns" : "test.things","name" : "_id_"}
]

就像每个人都记得传统RDBMS一样, 索引很重要,因为它们可以使文档检索更快。 但是,索引确实会占用内存,并且在插入文档时会稍微降低性能,因为必须更新所有相应的索引。 因此,尽管您应该认真考虑使用索引,但是在使用索引时需要经济。

自然地,仅当您知道文档的_id时才进行搜索。 通常会通过其他字段来搜索文档,如果您发现自己是通过时间序列 (例如created_at进行搜索的,那么您就来了。

想象一个称为logs的集合,其中包含捕获各种日志消息的简单文档。 示例文档如下所示:

日志收集中的一个简单文档:

{"_id" : ObjectId("51c4ab6d4d6906d494460728"),"message" : "crashed, no such method exception","type" : "crash","created_at" : ISODate("2013-06-21T19:37:17.992Z")
}

如果我想查找某个日期(例如今天)的所有日志消息怎么办? 我可以这样写查询:

查找自2013年6月20日以来创建的所有日志:

db.logs.find({created_at:{'$gt': new Date(2013, 5, 20)}})

如果我对该查询进行解释,则可以看到,因为我在created_at上没有索引,因此可以利用基本游标,并且扫描了集合中的所有文档以检索结果。

我的发现附有一个解释计划:

> db.logs.find({created_at:{'$gt': new Date(2013, 5, 20)}}).explain()
{"cursor" : "BasicCursor","isMultiKey" : false,"n" : 2,"nscannedObjects" : 4,"nscanned" : 4,"nscannedObjectsAllPlans" : 4,"nscannedAllPlans" : 4,"scanAndOrder" : false,"indexOnly" : false,"nYields" : 0,"nChunkSkips" : 0,"millis" : 0,"indexBounds" : {},"server" : "ghome-computer.home:27017"
}

如您所见,通过created_at字段进行搜索可能效率不高; 因此,您可能很想在该字段上添加索引。 这自然会使该特定查询效率更高,但是,您将招致新索引的开销,这将消耗更多的内存,并且由于对该新创建的索引进行了更新,因此插入操作会稍微慢一些。

事实证明,由于_id字段在其中嵌入了Unix纪元,因此无需包含created_at字段,就可以轻松地编写find表达式。 例如, MongoDB Ruby驱动程序允许您从类似这样的Time创建ObjectId

通过from_time工厂方法创建一个新的ObjectId:

yesterday = Time.now - (60*60*(24*1))
custom_id = BSON::ObjectId.from_time(yesterday)
=> BSON::ObjectId('51c397800000000000000000')

如您所见,我通过from_time工厂方法创建了一个新的ObjectId 。 51c397800000000000000000是十六进制表示形式,前8位数字表示时间,其他所有内容均清零。

现在,我可以在任何find表达式中使用我的custom_id了。 通过Ruby驱动程序,我还可以将一个explain ,which'll展示自由的使用_id索引。

使用派生日期的ObjectId强制查找使用_id索引:

mongodb[:logs].find({_id: {'$gt' => custom_id}}).explain=> {"cursor"=>"BtreeCursor _id_", "isMultiKey"=>false, "n"=>1, "nscannedObjects"=>1, "nscanned"=>1, ....}

如果看到BtreeCusor ,则表明您正在使用索引; 如果看到BasicCursor ,那么您知道不是。

因此,如果您发现自己正在执行查询并为诸如created_at之类的某个时间或日期字段创建索引,那么最好只使用Mongo的_id字段,因为它已经嵌入了创建于at的概念,并且默认情况下已被索引。 数字?

参考: The Disco Blog博客上的MongoDB主键是我们JCG合作伙伴 Andrew Glover的朋友 。

翻译自: https://www.javacodegeeks.com/2013/06/mongodb-primary-keys-are-your-friend.html

mongodb 主键

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web前端知识点太多_前端知识点总结——框架中报错集锦(含解决方法)

前端知识点总结——框架中报错集锦(含解决方法)1.vue1、指定template直接返回多个标签Component template should contain exactly one root element.解决方案:指定一个容器,将需要返回的多个标签放在这个容器中 div/form/a…2、读取了一个变量的属性但是…

信号与系统 chapter4 单位脉冲与单位阶跃序列

标题里有序列,说明咱们这里的自变量都是离散的,离散序列是相对于前面的连续信号而言,这里给它做了一个比较 单位脉冲序列 可以看到单位脉冲函数依然是十分牛批,只有在t0t0t0的地方才发挥作用 单位阶跃 两个单位阶跃序列做差可以…

原始性能数字– Spring Boot 2 Webflux与Spring Boot 1

我对性能测试的设置如下: 示例应用程序公开了一个端点(/ passthrough / message),该端点又调用下游服务。 到端点的请求消息如下所示: {"id": "1","payload": "sample payload&q…

airpods耳机敲击没反应_iOS11.2.6造成AirPods耳机出现奇怪问题 网友:解决方法很简单...

大河报大河客户端记者 华飞众所周知,苹果为了解决iOS11.2.5中特殊字符、图片引起的系统崩溃的问题,突然推送了iOS 11.2.6正式版,而随着更新用户不断增加,目前该版本对于使用AirPods 的iphone用户带来了不少奇怪问题,特…

gradle运行测试代码_Gradle的好处:运行单个测试

gradle运行测试代码我们可以使用Java插件添加的test任务,使用Gradle运行测试代码。 默认情况下,将执行项目中找到的所有测试。 如果要运行一个测试,可以使用Java系统属性test.single和测试名称。 实际上,系统属性的模式是taskName…

信号与系统 chapter5 线性系统与非线性系统

今天我们说一说系统的分类 线性系统 顾名思义,满足线性性质的系统 它有三个特性: 齐次性可加性线性性 这里常见在选择题里让你判断 f1(.)f_{1}(.)f1​(.)代表的是激励,系统的响应不仅和它当前的状态相关,还和以前的状态相关的…

python爬取音乐源码_手把手教你使用Python抓取QQ音乐数据(第一弹)

【一、项目目标】获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名、专辑名、播放链接。由浅入深,层层递进,非常适合刚入门的同学练手。【二、需要的库】主要涉及的库有:requests、json、openpyxl【三、项目实现】1.了解 QQ 音乐网站的 rob…

Java接口–历年来Java 9之旅–默认和私有方法

介绍 Java接口已经比Java版本进行了更多的演变,而Java 8和Java 9则有所发展。在本文中,我们将探讨接口在Java 8之前的样子以及如何在Java 8和Java 9中得到增强。 Java 8之前的接口 接口将具有一个或多个抽象方法,如下所示: publ…

信号与系统 chapter6 时变与时不变系统

时不变系统 通俗来说,就是输入延迟一段时间后,输出也延迟一段相同的时间。比如说一个示波器,你要给它上电显示波形,你就是示波器的输入,你一按下开关,它就马上亮了;下次你在开关上发呆5秒钟再按…

胆战心惊形容什么_胆战心惊的近义词

胆战心惊近义词: 不寒而栗( 注释:栗:畏惧,发抖。不冷而发抖。形容非常恐惧。)胆战心惊( 注释:战:通“颤”,发抖。形容十分害怕。)毛骨悚然( 注释:悚然:害怕的样子。汗毛竖起,脊梁骨发冷。形容十…

信号与系统 chapter7 因果与非因果

“因果”这个词常常在佛教里提到,比如有因才有果,放在信号与系统里就是你有输入才有输出,但是在所有的系统中你有输入就一定有输出吗?又或者是你有输出但没有输入,这样的系统如何称呼? 此类系统称为非因果系…

互联网和大数据是什么意思_何为互联网大数据?为什么每个人在数据的面前,相当于一丝不挂?...

何为互联网大数据?大数据背后核心迷局是什么?那通过下面一段对话,您可能就明白了。——必胜客店的电话铃响了。客服拿起电话:客服:您好! 请问有什么需要我为您服务?顾客:你好! 我想要…

ejb 2.1 jboss_JBoss AS7 JNDI和EJB 3.1命名更改

ejb 2.1 jboss由于“功能培训”继续前进,而我们又没有保持软件堆栈的最新状态,因此我们的团队发现自己处于不得不迁移的不利位置: JBoss 4.2.3到AS 7.1.x(当前为7.1.1) EJB 2.1到EJB 3.1 Hibernate2到Hibernate3或4…

信号与系统 chapter8 LTI连续系统的描述

我们这里对LTI系统的描述主要是用在电路分析上,我们一般先写出电路方程,对电路方程抽象以后得到微分方程 LTI系统的数学模型 这里注意一下电感上要求二阶导数,电阻上求一阶,然后为每一项分别写上系数,倘若读者到这里还…

安装jdk步骤rpm_jenkins rpm包方式安装

war包方式安装jenkins已经说过java openjdk的安装和注意事项,这里不做赘述前提:确保 java的jdk或者jre已安装#]java -version#]whereis java (whereis查看程序运行命令的)#]ls -lrt /usr/bin/java#]ls -lrt /etc/alternatives/java这里简单讲下which、wh…

使用ADF绑定创建视图对象行CreateInsert操作

在这篇简短的文章中,我将重点介绍与在任务流中创建新记录的一种非常常见的方法有关的一个小陷阱。 让我们考虑一个简单的任务流示例,该任务流创建一个新的VO行,如果用户单击“确定”按钮,则在页面片段上显示该行并提交事务&#…

信号与系统 chapter9 关于信号与系统中微分方程的求解

微分方程的求解 许多同学之所以觉得信号与系统难的原因之一就在于它的数学推导,特别是对于一些高等数学基础比较薄弱的同学来说,且不说后面的求解傅里叶变换部分,目前的LTI连续系统微分方程的求解,已经是的有的同学感到云里雾里。…

jpa 托管_Spring Boot-不是托管类型

我使用Spring boot JPA,启动服务时遇到问题。Caused by: java.lang.IllegalArgumentException: Not an managed type: class com.nervytech.dialer.domain.PhoneSettingsat org.hibernate.jpa.internal.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:21…

信号与系统 chapter10 系统的初值问题与系数匹配法

系统的初值问题就是让你求一下系统在0时刻的y(t)y(t)y(t)函数 我们看到它要我们求关于t0t0t0时刻的一些参数,我们这里首先就要想到冲激函数,为什么?因为冲激函数最特殊,它的特性就是在0时刻才有定义,才有值&#xff0…

信号与系统 chapter11 LTI系统的响应

我发现好多人都喜欢写“LTI连续系统”,殊不知LTI的全称就是LinearTimeInvariantSystemsLinear Time Invariant SystemsLinearTimeInvariantSystems,已经写出线性连续时不变了,就不要再翻译中画蛇添足了。 言归正传,前面我们分析的…