【MongoDB】BSON类型
目录
一、ObjectId
二、字符串(String)
三、时间戳(Timestamps)
四、日期(Date)
BSON是一种二进制序列化格式,用于在MongoDB中存储文档和进行远程过程调用。 有关BSON规范请访问bsonspec.org。
每种BSON类型标识符都具有整数和字符串两种表示方式,如下表:
类型 |
编号 |
别名 |
注释 |
Double |
1 |
“double” |
|
String |
2 |
“string” |
|
Object |
3 |
“object” |
|
Array |
4 |
“array” |
|
Binary Data |
5 |
“binData” |
|
Undefined |
6 |
“undefined” |
Deprecated(已废弃) |
objectId |
7 |
“objectId” |
|
Boolean |
8 |
“bool” |
|
Date |
9 |
“date” |
|
Null |
10 |
“null” |
|
Regular Expression |
11 |
“regex” |
|
DBPointer |
12 |
“dbPointer” |
Deprecated(已废弃) |
JavaScript |
13 |
“javascript” |
|
Symbol |
14 |
“symbol” |
Deprecated(已废弃) |
JavaScript code with scope |
15 |
“javascriptWithScope” |
Deprecated in MongoDB 4.4 |
32-bit integer |
16 |
“int” |
|
Timestamp |
17 |
“timestamp” |
|
64-bit integer |
18 |
“long” |
|
Decimal128 |
19 |
“decimal” |
New in version 3.4 |
Min Key |
-1 |
“minKey” |
|
Max Key |
127 |
“maxKey” |
- $ type运算符支持使用这些值根据BSON类型查询字段。 $ type还支持类型编号的别名,该别名与integer, decimal, double, 和 long BSON类型匹配。
- $ type聚合运算符返回其参数的BSON类型。
- 如果$ isNumber聚合运算符的参数为BSON类型integer, decimal, double, 或 long.,则返回true。(New in version 4.4)
注:$ type用于筛选字段值是指定的BSON type(s)类型的文档。例如:
{ field: { $type: <BSON type> } }
{ field: { $type: [ <BSON type1> , <BSON type2>, ... ] } }
要查看字段类型,请参阅mongo Shell检查字段类型。
将BSON转换为JSON,请参阅MongoDB扩展的JSON。
以下各节描述了BSON类型需要特别注意的事项。
一、ObjectId
ObjectId比较小,还是唯一的,可以快速生成并排序。ObjectId值的长度为12个字节,包括:
- 4字节的时间戳(自Unix时代以来以秒为单位的时间戳值),代表ObjectId的创建
- 5字节的随机值
- 3字节的递增计数器,初始化值是随机值
虽然BSON格式本身是低位字节序,但时间戳和计数器值却是高位字节序,最有效字节出现在字节序列前端。
字节序,顾名思义字节的顺序,就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。
字节序分为两类:Big-Endian和Little-Endian,定义如下:
a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
c) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。
在MongoDB中,存储在集合中的每个文档都需要一个唯一的_id字段作为主键。如果插入的文档省略_id字段,则MongoDB驱动程序会自动为_id字段生成ObjectId类型值。
同理,通过upsert:true更新操作插入的文档时,若_id字段省略,也自动生成。
MongoDB客户端应添加一个唯一ObjectId值的_id字段。在_id字段中使用ObjectIds具有以下额外优点:
- 通过mongo shell,可以使用ObjectId.getTimestamp()方法查看ObjectId的创建时间。
- 在存储ObjectId值的_id字段上进行排序大致相当于按创建时间进行排序。
重要提示
尽管ObjectId值应随时间增加,但不一定是单调的。这是因为他们:
- ObjectId仅包含秒级时间戳,因此在同一秒内创建的ObjectId值没有保证的顺序
- 由客户端生成,客户端可能具有不同的系统时钟。
参考资料:ObjectId()
二、字符串(String)
BSON字符串是UTF-8编码。
通常,在对BSON进行序列化和反序列化时,每种编程语言的驱动程序都会从该语言的字符串格式转换为UTF-8。这样就可以轻松地将大多数国际字符存储在BSON字符串中。 [1]此外,MongoDB $ regex查询在regex字符串中支持UTF-8。
[1]对于一个UTF-8字符集的字符串,对字符串使用sort()是合理的。但是,由于内部sort()使用C ++ strcmp api,因此排序顺序可能会错误地处理某些字符。
三、时间戳(Timestamps)
BSON有一种在MongoDB使用的特殊的内部时间戳类型,并且与常规Date类型无关。此内部时间戳记类型是64位值,其中:
- 最重要的32位是time_t值(自Unix时代以来的秒数)
- 最不重要的32位是某1秒内操作的递增序数。
由于BSON格式为低位优先,因此首先存储了最不重要的32位,但是mongod实例在所有平台上始终将先比较time_t值,在比较序数值,而不管字节顺序如何。
在一个mongod单实例中,时间戳值始终是唯一的。
在复本集中,操作日志(oplog)有一个ts字段。该字段值反映了BSON时间戳值的操作时间。
注意
BSON timestamp 类型是MongoDB内部使用。大多数情况下,在应用程序开发中,需要使用BSON date类型。更多信息,参考Date。
如果插入的文档包含带有空时间戳值的顶级字段时,MongoDB会将空时间戳值替换为当前时间戳值,但以下情况除外:如果_id字段本身包含空的时间戳值,则它将始终按原样插入并且不会被替换。
例:
插入有空时间戳值的文档:
db.test.insertOne( { ts: new Timestamp() } );
然后运行db.test.find()将返回一个文档(内容类似):
{ "_id" : ObjectId("542c2b97bac0595474108b48"), "ts" : Timestamp(1412180887, 1) }
mongodb服务已将ts的空timestamp值替换为插入时的timestamp值。
四、日期(Date)
BSON Date是一个64位整数,代表自Unix纪元(1970年1月1日)到现在的毫秒数。这样可以追溯到过去和未来约2.9亿年的日期范围。
官方的BSON规范将BSON日期类型称为UTC日期。
BSON日期类型已签名。 [2]负值表示1970年之前的日期。
例如,在mongo shell中使用 new Date()函数创建Date:
var mydate1 = new Date()
例如,在mongo shell中使用ISODate()函数创建Date:
var mydate2 = ISODate()
例如,将日期值转成字符串:
mydate1.toString()
例如,返回日期值的月份值;月索引从零开始,因此一月是月份0:
mydate1.getMonth()
[2]在2.0版之前,Date值被误解为无符号整数,这会影响日期字段上的排序,范围查询和索引。由于升级时不会重新创建索引。因此,如果使用较早版本的Date值创建了索引,并且1970年之前的日期与你的应用程序相关,请重新索引。
【MongoDB】BSON类型相关推荐
- mongodb查询值不为空_NoSQL之MongoDB——BSON与JSON类型
BSON类型 BSON是一种用来存储文档和MongoDB执行远程调用的二进制序列化格式.BSON规范位于bsonspec.org. BSON支持以下数据类型,每种数据类型都有一个相应的数字和字符串别名 ...
- MongoDB Go Driver BSON类型
Go Driver支持BSON类型表示对Mongo的操作 – D: 表示基础BSON文档.此命令或操作按顺序执行. – M: 与D相似,但不保留顺序.表示无序map. – A: 表示BSON数组. – ...
- golang常用库之-mgo.v2包、MongoDB官方go-mongo-driver包、七牛Qmgo包 | go操作mongodb、mongodb bson
文章目录 golang常用库之-mgo.v2包.MongoDB官方go-mongo-driver包.七牛Qmgo包 | go操作mongodb.mongodb bson 一.[不推荐]mgo.v2包 ...
- MongoDB时间类型
mongdb时间类型 Date() 显示当前的时间 new Date 构建一个格林尼治时间 可以看到正好和Date()相差8小时,我们是+8时区,也就是时差相差8,所以+8小时就是系统当前时间 I ...
- MongoDB指定类型查询数据
1.查看集合 show collections 2.向集合中添加数据 db.runoob.insertMany([ { 'title':'data1', 'url':'https://blog.51c ...
- springboot中mongodb自定义类型转换器
文章目录 1 场景 1.1 BigDecimal写入mongo 1.2 人工转换 1.3 自定义转换器 2 版本 3 步骤 3.1 定义转换器 3.2 配置mongoDb工厂类 3.3 加载自定义转换 ...
- MongoDB特定类型的查询
MongoDB 在一个文档中可以使用多种类型的数据,其中一些类型在查询时会有特别的行为. null null 的行为有一些特别.它可以与自身匹配,所以如果有一个包含如下文档的集合: > var ...
- MongoDB 数组类型查询 —— $elemMatch 操作符
描述 $elemMatch 数组查询操作用于查询数组值中至少有一个能完全匹配所有的查询条件的文档.语法格式如下: { <field>: { $elemMatch: { <query1 ...
- MongoDB索引类型
与关系型数据库一样,合理的使用索引可以大幅提高MongoDB的查询效率,本文介绍基础索引.复合索引.文档索引等几种常用索引的使用. 1. 基础索引与复合索引 1.1 基础索引 创建索引时,可以是一个集 ...
最新文章
- Pytorch:使用DCGAN实现数据复制
- 谈谈你对摩尔定理的理解.摩尔定理当前还是继续有效吗?
- 架构师养成之道-01-知识图谱
- Shadow DOM的理解
- sqlserver的存储过程mysql_mysql,sqlserver存储过程的创建及执行
- MFC操作读取excel文件
- Dynamics AX2012 Menu Items Type
- 视频教程-R语言数据挖掘-模型评估篇-大数据
- 交互设计精髓之理解输出
- mysql重启服务命令_重启mysql命令
- 《重构》笔记---坏代码的味道与处理
- 选修课计算机应用基础学什么,网络选修课-计算机应用基础 -期末考.docx
- 深夜街头被偷拍的扎心瞬间:成年人的体面,都是易碎品
- 假如魔兽由其他公司来做
- bigemap手机版app如何加载矢量数据
- Pinbox 一款极简主义风格的网络收藏夹
- linux内存管理之 ION 内存管理器浅析Ⅰ(system heap)
- 超详细的k8s对接ceph RBD存储
- 互联网晚报 | 1月6日 星期四 | 中国移动正式回归A股;京东成央视春晚独家互动合作伙伴;钉钉进军制造业...
- 太空人esp32/8266天气时钟学习经验