mongo Shell 中的数据类型
在本页面
MongoDB BSON为JSON之外的其他数据类型提供支持。 Drivers为宿主语言中的这些数据类型提供本机支持,并且mongo Shell 还提供了一些帮助程序类,以支持在mongo JavaScript Shell 中使用这些数据类型。有关更多信息,请参见Extended JSON参考。
Types
Date
mongo shell 提供了多种返回日期的方法,可以是字符串形式,也可以是Date
对象形式:
-
Date()
方法,以字符串形式返回当前日期。 -
new Date()
构造函数,使用ISODate()
包装器返回Date
对象。 -
ISODate()
构造函数,使用ISODate()
包装器返回Date
对象。
在内部,Date对象存储为带符号的 64 位整数,表示自 Unix 时代(1970 年 1 月 1 日)以来的毫秒数。
并非所有的数据库操作和驱动程序都支持完整的 64 位范围。您可以安全地处理日期范围在0
至9999
的年份。
返回日期作为字符串
要以字符串形式返回日期,请使用Date()
方法,如以下示例所示:
var myDateString = Date();
要打印变量的值,请在 shell 中键入变量名称,如下所示:
myDateString
结果是myDateString
的值:
Wed Dec 19 2012 01:03:25 GMT-0500 (EST)
要验证类型,请使用typeof
运算符,如下所示:
typeof myDateString
该操作返回string
。
Return Date
mongoShell 使用ISODate
帮助程序包装Date
类型的对象;但是,对象仍为Date
类型。
下面的示例同时使用new Date()
构造函数和ISODate()
构造函数返回Date
对象。
var myDate = new Date();
var myDateInitUsingISODateWrapper = ISODate();
您也可以将new
运算符与ISODate()
构造函数一起使用。
要打印变量的值,请在 shell 中键入变量名称,如下所示:
myDate
结果是包装在ISODate()
帮助器中的Date
值myDate
:
ISODate("2012-12-19T06:01:17.171Z")
要验证类型,请使用instanceof
运算符,如下所示:
myDate instanceof Date
myDateInitUsingISODateWrapper instanceof Date
该操作均返回true
。
ObjectId
mongo Shell 为ObjectId数据类型提供ObjectId()
包装器类。要生成新的 ObjectId,请在mongo shell 中使用以下操作:
new ObjectId
See
NumberLong
mongo shell 默认情况下会将所有数字视为浮点值。 mongo shell 提供NumberLong()
包装器来处理 64 位整数。
NumberLong()
包装器接受 long 作为字符串:
NumberLong("2090845886852")
以下示例使用NumberLong()
包装器写入集合:
db.collection.insertOne( { _id: 10, calc: NumberLong("2090845886852") } )
db.collection.updateOne( { _id: 10 },
{ $set: { calc: NumberLong("2555555000000") } } )
db.collection.updateOne( { _id: 10 },
{ $inc: { calc: NumberLong(5) } } )
检索文档以验证:
db.collection.findOne( { _id: 10 } )
在返回的文档中,calc
字段包含NumberLong
对象:
{ "_id" : 10, "calc" : NumberLong("2555555000005") }
如果使用$inc将包含NumberLong
对象的字段的值增加 float ,则数据类型将更改为浮点值,如以下示例所示:
db.collection.updateOne( { _id: 10 },
{ $inc: { calc: 5 } } )
- 检索更新的文档:
db.collection.findOne( { _id: 10 } )
在更新的文档中,calc
字段包含一个浮点值:
{ "_id" : 10, "calc" : 2555555000010 }
NumberInt
mongo shell 默认情况下会将所有数字视为浮点值。 mongo shell 提供NumberInt()
构造函数来显式指定 32 位整数。
NumberDecimal
3.4 版的新功能。
mongo Shell 默认将所有数字视为 64 位浮点double
值。 mongo shell 提供NumberDecimal()
构造函数来显式指定基于 128 位的基于十进制的浮点值,这些值可以精确地模拟十进制舍入。此功能适用于处理monetary data的应用程序,例如金融,税收和科学计算。
decimal
BSON type使用 IEEE 754 十进制 128 浮点编号格式,该格式支持 34 个十进制数字(即有效数字)和-6143 至 6144 的指数范围。
NumberDecimal()
构造函数接受decimal
值作为字符串:
NumberDecimal("1000.55")
该值存储在数据库中,如下所示:
NumberDecimal("1000.55")
NumberDecimal()
构造函数还接受mongo shell 的double
值(即不带引号),尽管不建议这样做,因为这样做会降低精度。构造函数创建基于二进制的double
精度表示形式的基于十进制的参数(可能会丢失精度),然后将该值转换为精度为 15 位的decimal
值。下面的示例隐式地将值作为double
传递,并显示如何以 15 位精度创建值:
NumberDecimal(1000.55)
该值存储在数据库中,如下所示:
NumberDecimal("1000.55000000000")
下面的示例将值隐式传递为double
,并说明如何发生精度损失:
NumberDecimal(9999999.4999999999)
该值存储在数据库中,如下所示:
NumberDecimal("9999999.50000000")
Note
要将decimal
数据类型与MongoDB driver一起使用,请确保使用支持该数据类型的驱动程序。
平等和排序 Sequences
decimal
类型的值将与其他数字类型进行比较,并根据其实际数字值进行排序。基于二进制的double
类型的数字值通常具有基于十进制的值的近似表示,并且可能与它们的decimal
表示不完全相同,因此在检查decimal
值的相等性时使用NumberDecimal()
构造函数。考虑以下示例以及numbers
集合中的以下文档:
{ "_id" : 1, "val" : NumberDecimal( "9.99" ), "description" : "Decimal" }
{ "_id" : 2, "val" : 9.99, "description" : "Double" }
{ "_id" : 3, "val" : 10, "description" : "Double" }
{ "_id" : 4, "val" : NumberLong(10), "description" : "Long" }
{ "_id" : 5, "val" : NumberDecimal( "10.0" ), "description" : "Decimal" }
将下表中的查询插入db.numbers.find(<query>)
方法后,将返回以下结果:
Query | Results |
---|---|
{ "val": 9.99 } | { "_id": 2, "val": 9.99, "description": "Double" } |
{ "val": NumberDecimal( "9.99" ) } | { "_id": 1, "val": NumberDecimal( "9.99" ), "description": "Decimal" } |
{ val: 10 } | { "_id": 3, "val": 10, "description": "Double" } |
{ "_id": 4, "val": NumberLong(10), "description": "Long" } { "_id": 5, "val": NumberDecimal( "10.0" ), "description": "Decimal" } | |
{ val: NumberDecimal( "10" ) } | { "_id": 3, "val": 10, "description": "Double" } { "_id": 4, "val": NumberLong(10), "description": "Long" } { "_id": 5, "val": NumberDecimal( "10.0" ), "description": "Decimal" } |
第一个查询{ "val": 9.99 }
隐式搜索9.99
的double
表示形式,该表示形式不等于该值的decimal
表示形式。
NumberDecimal()
构造函数用于查询9.99
的decimal
表示形式的文档。排除double
类型的值,因为它们与9.99
的decimal
表示形式的确切值不匹配。
查询整数时,将返回所有数字类型的匹配值。例如,查询10
的double
表示将在结果中包括10.0
的decimal
表示,反之亦然。
检查十进制类型
要测试decimal
类型,请使用$type运算符,其字符串别名"decimal"
或19
(decimal
类型的数字代码)。
db.inventory.find( { price: { $type: "decimal" } } )
在 mongo Shell 中检查类型
为了确定字段的类型,mongo shell 提供了instanceof
和typeof
运算符。
instanceof
instanceof
返回一个布尔值以测试值是否是某种类型的实例。
例如,以下操作测试_id
字段是否为ObjectId
类型的实例:
mydoc._id instanceof ObjectId
该操作返回true
。
typeof
typeof
返回字段的类型。
例如,以下操作返回_id
字段的类型:
typeof mydoc._id
在这种情况下,typeof
将返回更通用的object
类型而不是ObjectId
类型。