DAY5 MongoDB 资料型别与 _id

DAY5 MongoDB 资料型别与 _id

资料型别

首先要理解 MongoDB 储存的格式 BSON,就是 Binary JSON,虽然呈现都是 JSON 格式,但储存还是有型别之分,这就是 BSON 的优点。

BSON 型别有以下几种,常见的就不特别说明了

  • int
  • long
  • string
  • double
  • decimal
  • bool
  • date
  • timestamp
  • array
  • null
  • binData:此栏位储存二进制的资料(binary data)
  • objectId:MongoDB 的精髓,稍後会提到
  • object:相当於 embedded documentnested document,更白话的说就是文件内的子文件,如范例的 publisher 栏位:
{
   "_id": ObjectId("612cf44a031915cb2af17374"),
   "name":"Barcraft",
   "publisher":
   {
      "companyName":"Clizzard",
      "country":"Taiwan",
      "city":"Taipei"
   }
}
  • regex: 这型别是宣告此栏位专门用来储存正则式
{
   "_id": ObjectId("612cf44a031915cb2af17374"),
   "regexField": /[1-5]/
}
  • javascript:储存 javascript 语法用
{
   "_id": ObjectId("612cf44a031915cb2af17374"),
   "jsCode": "function() {var a = 1;}"
}

--

资料型别有很多,不过使用上多半还是原始的那几种,比较多人讨论到的是时间型别

Date我本身还真的没使用过,大部分都是使用Timestamp就能解决,且还有时区问题,如果没开发过跨时区系统,请务必缜密思考使用情境,例如不同时区的使用者如何查询资料。

_id 是什麽

  • MongoDB 预设每一个文件都有的栏位(连 embedded document 也是)
  • 系统会自动产生这个栏位
  • 每一个文件的唯一位置
  • 系统预设的 single index key
  • Collection 层级的唯一值
  • 资料型别为 ObjectId

长相如下:
_id: ObjectId("612cf44a031915cb2af17374")

_id 是由16进位、24字元所组成的(请特别注意并不等於 string),故 ObjectId 为 12 bytes,这 12 bytes 组成依序为:

  1. Timestamps 的 4 bytes
  2. 随机码的 5 bytes。
  3. 随机起始的递增计数器 3 bytes

特别要注意的是 timestamp 精确度只到秒级;第二项的随机码又可拆分为

  • 机器码(machine id) 3 bytes
  • 作业序(process id) 2 bytes

*注:这个项目在 MongoDB document 已经移除细节讨论,不过还是可以从过往文章来了解


所以最常被提及到的是,「系统产生的 _id 是否会重复?」关於这个答案其实可以从拆分的这 12 bytes 得到答案,在非刻意的情况下,理论上是有可能重复的。假设一秒内一台机器的同一个process,产生超过 3bytes 的计数器数量,就有可能会重复了。但在大部分商务情境使用,应该是没什麽机会遇到

_id 可否自行定义?

可以,只要你确保 Collection 层级的唯一性。

假设这是一个会员 Collection,那通常 MemberId 就相当适合当作 _id 栏位,因为 MemberId 是不会重复的,且可以快速地找到这笔资料,是上上之选。

_id 一定要 ObjectId 型别?

其实上面的问题就给出答案了,不需要。
int, long 都可以当作是 _id 的型别,只是 MongoDB 帮你产生的是 ObjectId。


本系列文章会同步发表於我个人的部落格 Pie Note


<<:  [Day 5] Course 1_Foundation - 资料分析工具及职涯探索

>>:  【Day5】来了解一下Component的建立和使用方法吧!! ٩(●˙▿˙●)۶…⋆ฺ

[DAY19]旋转木马(02)

Column object for carousel thumbnailImageUrl Strin...

How do I eliminate QuickBooks Won't Export to Excel?

We are one of the top-rated, reliable, and self-go...

Day11-React 公测与产品的环境切分

Env 在建立的专案可以建立 .env 参数会增加 REACT_APP_ 的 prefix 可以将常...

Day 14 Docker 操作

今天来介绍一下 Docker 的指令与操作。当我们在执行 Docker Image 时,会将所有的相...

D01 / 为什麽要写这个? - 前言

Hi 我是 Tomaz.  第一次参加铁人赛,和各位铁人一起进行磨练,希望撑得过去 ? 认真学 Co...