类型
Date 日期
所述mongo
shell提供了各种方法来返回日期,无论是作为一个字符串或作为Date
对象:
Date()
以字符串形式返回当前日期的方法。new Date()
构造函数,Date
使用ISODate()
包装器返回对象 。ISODate()
构造函数,Date
使用ISODate()
包装器返回对象 。
在内部,Date对象存储为带符号的64位整数,表示自Unix纪元(1970年1月1日)以来的毫秒数。
并非所有的数据库操作和驱动程序都支持完整的64位范围。你可以安全使用日期与工作的包容性的范围内,年内 0
通过9999
。
返回日期作为字符串
要以字符串形式返回日期,请使用Date()
方法,如以下示例所示:
var myDateString = Date();
打印变量:
myDateString
打印结果:
Thu Jun 18 2020 16:38:55 GMT+0800 (CST)
验证类型:
typeof myDateString
返回Date
所述mongo
shell包裹的对象Date
使用该类型 ISODate
的辅助; 但是,对象类型仍为 Date
。
以下示例同时使用构造函数和 构造函数来返回对象。
var myDate = new Date();
var myDateInitUsingISODateWrapper = ISODate();
验证类型:
myDate instanceof Date
myDateInitUsingISODateWrapper instanceof Date
都是返回true
ObjectId
生成新的对象ID:
new ObjectId
NumberLong
mongo
默认情况下,Shell将所有数字视为浮点值。所述mongo
shell提供了NumberLong()
处理64位整数。
该NumberLong()
只要接受一个字符串:
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,则数据类型将变为浮点值,如以下示例所示:
1.用于$inc
将calc
字段增加5
, mongo
shell将其视为浮点数:
db.collection.updateOne( { _id: 10 },
{ $inc: { calc: 5 } } )
2.检索更新文档:
db.collection.findOne( { _id: 10 } )
结果:
{ "_id" : 10, "calc" : 2555555000010 }
NumberInt
mongo
默认情况下,Shell将所有数字视为浮点值。该mongo
shell提供了NumberInt()
构造函数来显式地指定32位整数。
NumberDecimal
3.4版的新功能。
默认情况下,mongo
Shell将所有数字视为64位浮点 double
值。所述mongo
shell提供了 NumberDecimal()
构造,以明确指定的128位为基础的十进制能够模拟与小数精度精确舍入的浮点值。此功能适用于处理 货币数据(例如金融,税收和科学计算)的应用程序。
所述decimal
BSON类型 使用其支持34位十进制数字的IEEE 754 DECIMAL128浮点编号格式(即显著位数)和-6143到6144的指数范围。
该NumberDecimal()
构造函数接受的decimal
值作为一个字符串:
NumberDecimal("1000.55")
该值存储在数据库中,如下所示:
NumberDecimal("1000.55")
下面的示例将值隐式传递为a,double
并说明如何发生精度损失:
NumberDecimal(9999999.4999999999)
该值存储在数据库中,如下所示:
NumberDecimal("9999999.50000000")
注意
要将decimal
数据类型与MongoDB驱动程序一起使用,请确保使用支持该数据类型 的驱动程序
平等和排序
将decimal
类型的值与其他数字类型进行比较,并根据它们的实际数字值对其进行排序。基于二进制的double
类型的数字值通常具有基于十进制的值的近似表示,并且可能与它们的decimal
表示不完全相同,因此NumberDecimal()
在检查decimal
值的相等性时请使用 构造 函数。考虑以下示例以及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 },隐式使用的是double类型查询,而不会查询decimal类型的值。
该NumberDecimal()
构造函数用于查询与文档decimal
的表示9.99
。double
类型的值 被排除在外,因为它们与的decimal
表示形式的确切值不匹配9.99
。
查询整数时,将返回所有数字类型的匹配值。例如,查询的double
表示 10
将包括结果中的decimal
表示,10.0
反之亦然。
检查decimal
类型
要测试decimal
类型,请使用$type
字符串别名"decimal"
或的操作符19
,该数字为该decimal
类型的数字代码 。
db.inventory.find( { price: { $type: "decimal" } } )
在mongo
Shell中检查类型
为了确定字段的类型,mongo
shell提供了instanceof
和 typeof
运算符。
instanceof
instanceof
返回一个布尔值以测试值是否是某种类型的实例。
例如,以下操作测试该_id
字段是否为type的实例ObjectId
:
mydoc._id instanceof ObjectId
操作返回true
。
typeof
typeof
返回字段的类型。
例如,以下操作返回_id
字段的类型:
typeof mydoc._id
在这种情况下,typeof
将返回更通用的object
类型而不是ObjectId
类型。