Hi~朋友,关注置顶防止错过消息
MongoDB使用BSON进行数据的存储,BSON是JSON的二进制表现形式,支持比JSON更多的数据类型。
Document结构
Doccument的结构是键值对的形式,其中值可以是任意的BSON type,也可以是Document或者Document的数组。
Document Field
Field必须是字符串且有以下限制:
MongoDB的Dcocument不支持重复的Field。
MongoDB使用.来访问数组中的元素或者Document中的field。
Document限制
_id Field
MongoDB中,每一个Document必须要存储一个唯一的_id作为主键,如果代码中没有写入这个值,MongoDB会自动生成一个ObjectId进行写入。
MongoDB会在创建集合时对_id字段创建唯一索引。
对于_id字段通常会有以下建议:
过滤Document结构
在过滤Document时,通常表达式如下:
{
<field1>: <value1>,
<field2>: { <operator>: <value>},
...
}
更新Document结构
对于更新Document,更新值的表达式通常如下:
{
<operator1>: { <field1>: <value1>, ... },
<operator2>: { <field2>: <value2>, ... },
...
}
Document索引结构
对于Document的索引定义,表达式通常如下:
{ <field1>: <type1>, <field2>: <type2>, ... }
BSON Types
BSON是用于MongoDB进行数据存储和远程调用时的二进制序列化协议,每一种BSON类型都有其对应的数字和字符串表示,如下:
通过$type字段我们可以查出字段为某个类型的Document,如下:
db.products.find({_id: {$type: 7}})
Binary Data
binData类型的数据都有一个subtype用来表示如何解释此二进制数据,如下图:
ObjectId
ObjectId具有小,尽可能的唯一,快速生成且有序的特点,长度为12个字节,主要由以下三部分组成:
如果ObjectId在写入时指定了Integer的值,该值将会被用来替换timestamp,ObjectId有可能不是单调递增,原因是ObjectId在同一秒内无法保证递增,并且生成ObjectId的系统时钟也有可能不同。
String
BSON中String的编码格式是UTF8,这可以使得MongoDB能够存储绝大多数国际字符。
Timstamp
在MongoDB内部,BSON的timestamp与常规的Date类型有所不同,它由64bit表示:
在比较Timestamp时,虽然存储使用的是小端序存储,但是所有的平台总是先比较time_t,然后再比较ordinal,这样可以保证不受大小端序的影响。
Date
BSON中的Date存储采用64bit的整数来表示,存储的值为Unix时间戳,单位为毫秒。
MongDB中的比较排序
在不同的BSON types的比较时,从小到大依次为:
String比较
MongoDB通常使用简单二进制进行比较,在创建Collection时,我们可以通过指定collation option来定义指定语言的比较规则,如字母大小写和重音符号的比较规则,如下:
{
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}
Array比较
Object比较
按按照键值对递归进行比较,首先比较字段类型,如果字段类型相同比较字段名称,如果字段名称相同再比较字段值。
不存在的属性会被视为空的BSON Object,因此{}和{a: null}是同等大小。
BinData
BinData的sub type主要有以下类型:
MongoDB Extended JSON
JSON是BSON的一个子集,为了保留BSON中的数据类型,MOngoDB提供MongoDB Extended JSON来进行支持,MongoDB中的扩展JSON有两种模式:
BSON中对应的扩展JSON的严格模式和宽松模式的主要表现形式如下图: