MongoDB指南/引言
引言
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 過程
創建固定集合
在 mongoshel 中, 使用 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內部處理程序 創建的 文檔可能會有 重名的字段 ,但不會向用戶文檔中添加 重名 字段。
字段值約束
對于已經索引的集合來說,索引字段值有最大索引鍵值長度限制。
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解析器,包括mongoshell 和 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") }
來自:http://www.cnblogs.com/hdwgxz/p/5879317.html