【原文地址】https://docs.mongodb.com/manual/ 引言 MongoDB是一種開源文檔型資料庫,它具有高性能,高可用性,自動擴展性 1.文檔資料庫 MongoDB用一個文檔來表示一條記錄,文檔的數據結構由鍵值對組成。MongoDB文檔類似於JSON對象,欄位值可能是文檔,數 ...
【原文地址】https://docs.mongodb.com/manual/
引言
MongoDB是一種開源文檔型資料庫,它具有高性能,高可用性,自動擴展性
1.文檔資料庫
MongoDB用一個文檔來表示一條記錄,文檔的數據結構由鍵值對組成。MongoDB文檔類似於JSON對象,欄位值可能是文檔,數組,或文檔數組。
使用文檔的優點:
- 文檔中欄位值的數據類型同大多數編程語言中的原生數據類型一致。
- 嵌入式文檔和數組減少了連接查詢的需求。
- 動態的文檔結構支持多態性。
2.主要特性
高性能
MongoDB支持高性能數據存儲。特別地:
- 支持嵌入式數據模型以減少對資料庫系統的I/O
- 利用索引實現快速查詢,並且嵌入式文檔和集合也支持索引
豐富的查詢語言
MongoDB提供了豐富的查詢語言以支持讀寫操作和聚集操作、文本檢索、地理信息查詢
高可用性
MongoDB的複製能力被稱作複製集(replica set),它提供了自動的故障遷移和數據冗餘。一個複製集是一組包含了相同數據的多台MongoDB伺服器,它提供了冗餘性和加強了數據的可用性。
橫向擴展
MongoDB的橫向擴展能力是其核心功能的一部分:
- 分片的數據分佈在伺服器集群上。
- 帶標簽的分片能夠引導數據到指定的分片上。
支持多存儲引擎
包括:WiredTiger Storage Engine,MMAPv1 Storage Engine。此外,MongoDB 提供可插拔存儲引擎API,允許第三方開發者為MongoDB開發存儲引擎。
3.資料庫和集合
MongoDB 存儲BSON文檔,例如數據記錄在集合中,集合在資料庫中。
3.1資料庫
在MongoDB 中資料庫持有集合。
在Mongo shell中,選中一個資料庫使用如下命令:use <db> ,例如:
use myDB
創建資料庫
如果待操作的資料庫不存在,那麼在第一次向MongoDB 存儲數據時,MongoDB會創建這個資料庫。例如,使用如下命令操作一個不存在的資料庫。
use myNewDB
db.myNewCollection1.insert( { x: 1 } )
insert()操作創建了資料庫myNewDB,若集合myNewCollection1也不存在,同樣地集合myNewCollection1也被創建。
3.2集合
MongoDB 在集合中存儲文檔,集合類似於關係資料庫中的表。
創建一個集合
如果一個集合不存在,使用下麵命令時集合會被創建:
db.myNewCollection2.insert( { x: 1 } )
db.myNewCollection3.createIndex( { y: 1 } )
insert() 和 createIndex()在集合不存在的情況下會創建集合。
顯式創建集合
MongoDB 提供了db.createCollection()方法來顯示地創建一個集合。可以為創建的集合指定參數,例如設置集合的大小或者文檔的驗證規則,如果不需要指定這些參數,那麼沒必要顯示地創建一個集合。
文檔驗證(3.2版新特性)
預設情況下,一個集合中的文檔不必具有相同的結構 ,
一個集中的文檔不需要具有一系列相同的欄位,並且不同文檔中欄位的數據類型可以不同。
修改文檔結構
可以更改集合中的文檔結構,如添加新欄位,刪除現有欄位,或將欄位值更改為一種新的類型,更新文檔結構
3.3固定集合
3.3.1概述
固定集合,即具有固定大小的集合,它支持基於插入順序的插入和查詢這兩種高通量操作。固定大小的集合的工作方式類似於迴圈緩存:一旦一個集合被填滿,待插入的文檔會覆蓋掉最先插入的文檔。
3.3.2行為
插入順序
固定集合保證了插入順序,因此對於查詢操作而言,不需要索引的支持就可以返回多個按順序排列的文檔。沒有索引的開銷,固定集合支持更高的插入吞吐量。
自動刪除最先插入的文檔
為了給新文檔讓出存儲空間,固定集合自動刪除最先插入的文檔而不需要顯示的刪除操作。
例如,集合oplog.rs中存儲了副本集操作日誌,這裡副本集使用了固定集合。考慮下麵對固定集合可能的操作:
- 存儲由大容量系統生成的日誌信息。在無索引的情況下,文檔插入固定集合的速度與將日誌信息寫入文件系統的速度相似。此外,先進先出的特性保證了事件的順序,同時管理了存儲的使用。
- 在固定集合中緩存少量數據。由於緩存重讀而非寫,你應確保這個集合總在工作集中(例如,記憶體中)或接受一點點寫操作,因為索引需要寫操作。
_id 欄位索引
固定集合含有_id欄位,此欄位索引是預設的。
3.3.3限制和建議
更新
如果你要更新固定集合中的文檔,創建索引以防止全表掃描。
文檔大小(3.2版本變更)
如果更新或替換操作改變了文檔大小,則操作失敗。
刪除文檔
不能刪除固定集合中的文檔,可使用drop() 命令刪除整個固定集合並新建之。
分片
固定集合不允許分片。
查詢效率
使用自然排序可高效地檢索最新插入的元素。這是(有點)像追蹤一個日誌文件。
聚集操作符$out
不能使用聚集管道操作符$out將結果寫入固定集合
3.3.4過程
創建固定集合
在mongo shel中,使用db.createCollection()方法創建固定集合,創建固定集合的時候要指定集合的位元組大小,MongoDB將會提前為所創建的固定集合分配存儲空間。固定集合的位元組大小包含了內部使用的空間大小。
db.createCollection( "log", { capped: true, size: 100000 } )
如果欄位的位元組大小小於等於4096位元組,那麼固定集合的位元組大小為4096位元組。否則MongoDB 會將給定值提升為256位元組的整數倍。
另外,你可以使用max 欄位設置集合中文檔的最大數量:
db.createCollection("log", { capped : true, size : 5242880, max : 5000 } )
註意:對size的設置是必須的。在集合中的文檔數量還未達到最大值而集合的位元組大小已經達到最大時, MongoDB 同樣會移除最先插入的文檔。
查詢固定集合
如果使用 find()方法查詢固定集合而沒有指定排序規則,查詢返回結果的排序和文檔插入時的排序是一樣的。
為了使查詢結果的排序與插入時相反,可以使用sort() 方法並將$natural參數設置為-1:
db.cappedCollection.find().sort( { $natural: -1 } )
檢查集合是否為固定集合
使用isCapped()方法檢查集合是否為固定集合:
db.collection.isCapped()
將集合轉換為固定集合
使用convertToCapped 命令將一個非固定集合轉換為固定集合:
db.runCommand({"convertToCapped": "mycoll", size: 100000});
size 參數設定了固定集合的位元組大小。
警告:這個命令將會獲得全局寫入鎖,它會阻塞其他操作直到此操作完成為止。
在指定的一段時間後自動移除數據
對於數據過期的情形,為支持額外的靈活性,可使用MongoDB的TTL索引。這些索引允許你利用一種特殊的類型使數據過期並從普通集合中移除,這種特殊的類型是基於時間欄位值和TTL值的。
TTL集合與固定集合不相容。
Tailable游標
對於固定集合,可以使用Tailable游標。Tailable游標類似於Unix 的tail -f命令,Tailable游標追蹤固定集合的末端。新文檔插入固定集合的同時,可以使用Tailable游標檢索文檔。
4.文檔
MongoDB將數據存儲為BSON 文檔,BSON是一個JSON文檔的二進位表示形式,但它所包含的數據類型比JSON多。
4.1 文檔結構
MongoDB文檔是由鍵值對構成的,形式如下:
{
field1: value1,
field2: value2,
field3: value3,
...
fieldN: valueN
}
欄位值的類型可以是任何BSON類型,包括:文檔,數組,文檔數組,例如:
var mydoc = {
_id: ObjectId("5099803df3f4948bd2f98391"),
name: { first: "Alan", last: "Turing" },
birth: new Date('Jun 23, 1912'),
death: new Date('Jun 07, 1954'),
contribs: [ "Turing machine", "Turing test", "Turingery" ],
views : NumberLong(1250000)
}
上面的例子包括以下類型:
- _id為ObjectId類型
- name為嵌入式文檔類型(embedded document),包括first和last欄位
- birth和death為日期類型(Date)
- contribs為字元串數組類型(array of strings)
- views為長整型(NumberLong )
欄位名稱
欄位的名稱是字元串。
對於欄位的命名有下麵的約束:
- _id為保留欄位,用做主鍵,_id的值與其所在的集合中必須唯一,不可更改,可以是除數組以外的任何類型。
- 欄位名稱不能以“$”符開始。
- 欄位名稱不能包含“.”。
- 欄位名稱不能包含空字元。
BSON 文檔允許有相同的欄位名稱。大多數的MongoDB介面不支持欄位名稱重覆。如果需要重覆的欄位名稱,請查看你所使用的驅動文檔。
MongoDB內部處理程式創建的文檔可能會有重名的欄位,但不會向用戶文檔中添加重名欄位。
欄位值約束
對於已經索引的集合來說,索引欄位值有最大索引鍵值長度(Maximum Index Key Length)限制。
4.2 圓點記法
MongoDB使用圓點符號來訪問數組中的元素和嵌入式文檔欄位。
數組
MongoDB中數組是基於0索引的。使用圓點連接集合名稱和索引位置:
"<array>.<index>"
例如,給定下麵的文檔
{
...
contribs: [ "Turing machine", "Turing test", "Turingery" ],
...
}
為了訪問第三個元素,可以這樣:contribs.2
嵌入式文檔
使用圓點連接嵌入式文檔名稱和文檔欄位名稱:
"<embedded document>.<field>"
例如,給定下麵的文檔
{
...
name: { first: "Alan", last: "Turing" },
contact: { phone: { type: "cell", number: "111-222-3333" } },
...
}
- 為了指定last欄位,使用"name.last"。
- 為了指定number欄位,使用"contact.phone.number"
4.3 文檔約束
文檔大小約束
BSON 文檔最大為16MB。設置單個文檔大小的最大值有助於確保單個文檔不會耗盡系統記憶體,或者在傳輸的過程中不會占用太多的帶寬。為了能夠存儲超過最大值的文檔,MongoDB提供了GridFS API。
文檔欄位順序
除以下情況外,MongoDB保持寫入時的欄位順序:
- _id欄位總是位於文檔的首位。
- 重命名欄位可能會引起欄位重新排序。
從2.6版本開始MongoDB保持寫入時的欄位順序,但之前的版本並非如此。
_id欄位
在MongoDB中,文檔需要_id欄位作為主鍵,如果插入文檔時沒有指定_id欄位,MongoDB會使用ObjectIds 作為預設的_id的預設值。例如,向集合中插入一個不包含位於文檔開始處的_id欄位的文檔,MongoDB會將_id添加進來並且其類型為ObjectIds 。
另外,如果Mongod接收一個待插入的不包含_id欄位的文檔,Mongod將會添加一個ObjectIds 類型的欄位。
_id欄位有下列行為和約束:
- 預設地,在創建集合的同時,MongoDB 為_id欄位創建唯一索引。
- _id欄位總是文檔中的第一個欄位,如果插入文檔的_id欄位不是第一個欄位,那麼MongoDB會將其移動到首位。
- _id欄位可以是除數組以外的任何BSON 類型。
警告:為了保證複製功能,不要在_id欄位存儲BSON 正則表達式類型。
下麵是關於_id欄位值的常見選項:
- 使用ObjectIds 類型。
- 儘可能使用自然唯一字元,這樣可以節省存儲空間和避免額外的索引。
- 生成自增長數值
- 在你的應用程式中使用UUID。為了在集合和_id索引中更有效地存儲UUID,將UUID存儲為BSON BinData類型。如果滿足下麵的條件,索引鍵會更有效被存儲。
binary subtype 值取值範圍為0-7 或 128-135
位元組數組的長度是:0,1,2,3,4,5,6,7,8,10,12,14,16,20,24或32.
- 使用你正在用的MongoDB驅動生成UUID。註意你所用的驅動對於UUID的序列化與反序列化與其他驅動可能不相容。
4.4 文檔結構其他用途
除了定義數據記錄,MongoDB使用文檔結構貫穿始終,包括但不限於:查詢過濾器,更新規範文檔,索引規範文檔。
查詢過濾器文檔
查詢過濾器文檔指定了檢索,更新,刪除文檔的條件。
可以使用<field>:<value>表達式來指定相等條件和查詢運算符表達式。
{
<field1>: <value1>,
<field2>: { <operator>: <value> },
...
}
更新規範文檔
在db.collection.update()方法執行期間,更新規範文檔使用更新運算符指明待修改欄位。
{
<operator1>: { <field1>: <value1>, ... },
<operator2>: { <field2>: <value2>, ... },
...
}
索引規範文檔
索引規範文檔定義了要索引的欄位和索引類型。
{ <field1>: <type1>, <field2>: <type2>, ... }
5. BSON類型
BSON是一種用來存儲文檔和MongoDB執行遠程調用的二進位序列化格式。BSON規範位於bsonspec.org。
BSON支持以下數據類型,每種數據類型都有一個相應的數字和字元串別名,可以使用別名和$type操作符基於類型匹配模式檢索文檔。
Type |
Number |
Alias |
Notes |
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” |
|
JavaScript |
13 |
“javascript” |
|
Symbol |
14 |
“symbol” |
|
JavaScript (with scope) |
15 |
“javascriptWithScope” |
|
32-bit integer |
16 |
“int” |
|
Timestamp |
17 |
“timestamp” |
|
64-bit integer |
18 |
“long” |
|
Min key |
-1 |
“minKey” |
|
Max key |
127 |
“maxKey” |
|
5.1 比較/排序順序
當比較不同BSON類型的值時,MongoDB使用下麵的比較順序,從最低到最高:
1.MinKey (內部類型)
2.Null
3.Numbers (ints, longs, doubles)
4.Symbol, String
5.Object
6.Array
7.BinData
8.ObjectId
9.Boolean
10.Date
11.Timestamp
12.Regular Expression
13.MaxKey (內部類型)
對於比較而言,MongoDB將一些類型看作是等價的。例如,數值類型在比較之前執行轉換。
3.0.0版本的變化:Date排在Timestamp 之前。之前的版本,Date和Timestamp 排序相同。
對於比較而言,MongoDB將不存在的欄位看作空BSON 對象,例如,對{ } 和{ a: null }在排序中被看作是等價的。
對於數組而言,小於比較或者升序排序比較的是數組中最小的元素,大於比較或者降序排序比較的是數組中最大的元素。例如,比較一個只有一個元素的數組類型欄位(例如 [ 1 ]))和非數組欄位(例如2),比較的是1和2。
空數組(例如[])的比較被看作是小於空(null)或被看作丟失的欄位。
對於BinData 類型,按下麵順序排序:
1.首先,按數據的長度或大小排序。
2.然後,按BSON一個位元組子類型排序。
3.最後,一個字節一個位元組地比較。
下麵的章節針對特定的BSON類型描述了特別的註意事項:
5.2 ObjectId
ObjectId占據存儲空間小、唯一、可被快速生成和索引。ObjectId類型值為12位元組,前四個位元組是一個時間戳,表示其被創建的時間:
- 前四個位元組表示從UNIX新紀元來的秒數。
- 接下來的三個位元組表示機器編號。
- 接下來的兩個位元組表示進程ID。
- 最後三個位元組表示以隨機數開始的計數。
在MongoDB中,集合中的文檔需要一個作為主鍵的唯一_id欄位,如果沒有指定_id欄位,MongoDB預設將ObjectId類型值作為_id欄位值。例如,待插入文檔不包含頂級_id欄位,MongoDB驅動就會添加一個ObjectId類型的_id欄位。
另外,如果mongod接收的待插入文檔不包含_id欄位,mongod將會添加一個ObjectId類型的_id欄位。
MongoDB 客戶端應該添加一個值為ObjectId的_id欄位,使用值為ObjectId的_id欄位有如下好處:
- 在mongo shell中,你可以使用ObjectId.getTimestamp() 方法獲得ObjectId創建的時間。
- 給值為ObjectId的_id欄位排序大體等價於按時間排序。
重要的:
在一秒之內,ObjectId值的順序與生成時間之間的關係並不是嚴格的。如果單系統中,多個系統或多個進程或多個線程在一秒內產生了多個ObjectId值,這些值並不會嚴格地按照插入順序展示。多客戶端之間的時鐘偏移也會導致不嚴格排序,即使這些值由客戶端驅動程式生成。
5.3 String
BSON 的String類型是UTF-8編碼的。一般來說,每種語言對應的驅動程式在執行序列化和反序列化BSON時將語言自身的string類型轉換為UTF-8編碼,這使得BSON string可以接受大多數國際字元。另外,使用$regex 查詢支持UTF-8編碼的正則表達式字元。
5.4 Timestamp
BSON 中有一個特殊的時間戳類型供MongoDB內部使用,並且不能和Date 配合使用。時間戳類型是64位的值:
- 第一個32位是time_t的值(從UNIX新紀元來的秒數)。
- 第二個32位是給定時間里一些操作的遞增序號。
在一個mongod實例中,時間戳的值是唯一的。
在複製功能中,oplog有一個ts欄位,欄位值使用DSON時間戳,它反映了操作時間。
註:
BSON時間戳類型(Timestape)是供MongoDB內部使用的。大多數情況下,開發應用程式時使用Date類型。
如果你所插入文檔的頂級欄位是一個空值的時間戳類型(Timestape),MongoDB 伺服器將會用當前的時間戳(Timestape)替換它。例如執行下麵的操作:
var a = new Timestamp();
db.test.insert( { ts: a } );
然後,使用db.test.find()方法查詢,返回結果為:
{ "_id" : ObjectId("542c2b97bac0595474108b48"), "ts" : Timestamp(1412180887, 1) }
如果ts是嵌入式文檔的一個欄位,伺服器會保持其為空值。
2.6版本中的變化:以前當插入文檔時,伺服器僅僅會替換頭兩個空值時間戳類型(Timestape)欄位,包括_id欄位。現在伺服器會替換任何的頂級欄位。
5.5 Date
BSON 日期類型是64位整型,表示從UNIX新紀元(Jan 1, 1970)來的毫秒數。這一結果表示了可表達的約2億9000萬年範圍內的過去和未來。
官方的BSON規範指出DSON日期類型是通用協調時間(UTC datetime)。
BSON日期類型是有符號的,負值表示1970年之前的日期。
例如:
在mongo shell中,使用new Date()構建日期:var mydate1 = new Date()
在mongo shell中,使用ISODate()構建日期:var mydate2 = ISODate()
返回時間值的字元串:mydate1.toString()
返回日期中的月份,日期是基於0索引的,所以一月份就是:mydate1.getMonth()
6.MongoDB對JSON的擴展
JSON所表示的類型僅是BSON數據類型的子集。為了表示類型信息,MongoDB對JSON做如下擴展:
- strict模式。BSON類型的strict模式形式符合JSON RFC。任何的JSON分析器都能夠分析這些鍵值對形式的strict模式形式。然而,僅MongoDB內部的JSON分析器識別轉化為這種格式的信息。
- mongo Shell模式。MongoDB內部的JSON分析器和mongo shell都能解析這種模式。
這種形式被用於各種數據類型,這些類型依賴於JSON被解析的上下文環境。
6.1 解析器和支持的格式
以strict模式輸入
以下能夠解析strict模式形式,識別類型信息。
- REST Interfaces
- mongoimport
- 各種MongoDB工具的查詢選項
其他的JSON解析器,包括mongo shell 和db.eval()能夠解析鍵值對形式的strict模式表示,但是不能夠識別類型信息。
以mongo Shell 模式輸入
以下能夠解析mongo Shell模式表達,識別類型信息。
- REST Interfaces
- mongoimport
- 各種MongoDB工具的查詢選項
- mongo shell
以strict模式輸出
mongoexport 和REST and HTTP Interfaces以Strict模式輸出數據。
以mongo Shell 模式輸出
bsondump以mongo Shell 模式輸出數據。
6.2 BSON數據類型和相關的描述
下麵展示了strict模式和mongo Shell模式的一些BSON數據類型及相關描述。
Binary
Strict Mode |
|
mongo Shell Mode |
{ "$binary": "<bindata>", "$type": "<t>" } |
|
BinData ( <t>, <bindata> ) |
- <bindata>是base64編碼形式的二進位字元串
- <t> 表示用一個位元組指明數據類型。在strict模式中它是十六進位字元串,在mongo Shell模式中它是整數。
Date
Strict Mode |
|
mongo Shell Mode |
{ "$date": "<date>" } |
|
new Date ( <date> ) |
在strict模式中,<date>是ISO-8601數據格式的強制性時區欄位,它的模板為:YYYY-MM-DDTHH:mm:ss.mmm<+/-Offset>。
當前的MongoDB JSON解析器不支持載入Unix新紀元之前的ISO-8601 字元串日期。當格式化系統的time_t 類型的紀元之前和之後的時間時,採用下麵的格式:{ "$date" : { "$numberLong" : "<dateAsMilliseconds>" } }
在Shell 模式中,<date>是一個64位元組有符號整數的JSON形式,這個整數的表示形式為協調世界時間(UTC)的毫秒數。
Timestamp
Strict Mode |
|
mongo Shell Mode |
{ "$timestamp": { "t": <t>, "i": <i> } } |
|
Timestamp( <t>, <i> ) |
- <t> 為32位無符號整型UTC毫秒形式的JSON表達
- <i>為自增的32位無符號整型
Regular Expression(正則表達式)
Strict Mode |
|
mongo Shell Mode |
{ "$regex": "<sRegex>", "$options": "<sOptions>" } |
|
/<jRegex>/<jOptions> |
- <sRegex> 是由有效的JSON字元構成的字元串
- <jRegex> 是由有效的JSON字元和轉義雙引號字元構成的字元串,但可能不包含轉義的正斜杠(/),
- <sOptions> 是一個包含以字母表示的正則表達式選項的字元串
- <jOptions>是一個僅可能包含‘g’, ‘i’, ‘m’ 和‘s’ 的字元串,因為JavaScript和Mongo shell表示支持有限的選擇範圍,當轉化成這種表示時,不合格選項將被丟棄。
OID
Strict Mode |
|
mongo Shell Mode |
{ "$oid": "<id>" } |
|
ObjectId( "<id>" ) |
<id>是一個24字元的十六進位字元串。
DB Reference
Strict Mode |
|
mongo Shell Mode |
{ "$ref": "<name>", "$id": "<id>" } |
|
DBRef("<name>", "<id>") |
- <name> 是由有效的JSON字元構成的字元串。
- <id>是任何有效的JSON擴展類型。
Undefined Type
Strict Mode |
|
mongo Shell Mode |
{ "$undefined": true } |
|
undefined |
表示為JavaScript/BSON中未定義類型。
查詢文檔時不能使用未定義類型。將下麵的文檔插入people 集合:
db.people.insert( { name : "Sally", age : undefined } )
下麵的查詢會返回一個錯誤:
db.people.find( { age : undefined } )
db.people.find( { age : { $gte : undefined } } )
然而,可使用$type查詢未定義類型:
db.people.find( { age : { $type : 6 } } )
這個查詢返回所有age 欄位為未定義類型的文檔。
MinKey
Strict Mode |
|
mongo Shell Mode |
{ "$minKey": 1 } |
|
MinKey |
Minkey BSON數據類型的排序低於所有其他類型。
MaxKey
Strict Mode |
|
mongo Shell Mode |
{ "$maxKey": 1 } |
|
MaxKey |
MaxKey BSON數據類型的排序高於所有其他類型。
NumberLong(2.6版本新增)
Strict Mode |
|
mongo Shell Mode |
{ "$numberLong": "<number>" } |
|
NumberLong( "<number>" ) |
NumberLong 是64位有符號整數,必須使用引號否則它將會被理解為浮點型,這會導致精度丟失。
例如,插入9223372036854775807,卻沒有將其用引號括起來:
db.json.insert( { longQuoted : NumberLong("9223372036854775807") } )
db.json.insert( { longUnQuoted : NumberLong(9223372036854775807) } )
當查詢文檔時,longUnquoted 的值改變了,而longQuoted 的值沒變。
執行db.json.find(),返回結果為:
{ "_id" : ObjectId("54ee1f2d33335326d70987df"), "longQuoted" : NumberLong("9223372036854775807") }
{ "_id" : ObjectId("54ee1f7433335326d70987e0"), "longUnquoted" : NumberLong("-9223372036854775808") }
-----------------------------------------------------------------------------------------
轉載與引用請註明出處。
時間倉促,水平有限,如有不當之處,歡迎指正。