mongo Shell 中的数据类型

在本页面

MongoDB BSONJSON之外的其他数据类型提供支持。 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 位范围。您可以安全地处理日期范围在09999的年份。

返回日期作为字符串

要以字符串形式返回日期,请使用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()帮助器中的DatemyDate

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

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 ,则数据类型将更改为浮点值,如以下示例所示:

  • 使用$inccalc字段增加5mongoShell 将其视为浮点数:
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>)方法后,将返回以下结果:

QueryResults
{ "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.99double表示形式,该表示形式不等于该值的decimal表示形式。

NumberDecimal()构造函数用于查询9.99decimal表示形式的文档。排除double类型的值,因为它们与9.99decimal表示形式的确切值不匹配。

查询整数时,将返回所有数字类型的匹配值。例如,查询10double表示将在结果中包括10.0decimal表示,反之亦然。

检查十进制类型

要测试decimal类型,请使用$type运算符,其字符串别名"decimal"19(decimal类型的数字代码)。

db.inventory.find( { price: { $type: "decimal" } } )

在 mongo Shell 中检查类型

为了确定字段的类型,mongo shell 提供了instanceoftypeof运算符。

instanceof

instanceof返回一个布尔值以测试值是否是某种类型的实例。

例如,以下操作测试_id字段是否为ObjectId类型的实例:

mydoc._id instanceof ObjectId

该操作返回true

typeof

typeof返回字段的类型。

例如,以下操作返回_id字段的类型:

typeof mydoc._id

在这种情况下,typeof将返回更通用的object类型而不是ObjectId类型。