翻译或纠错本页面

Data Types in the mongo Shell

MongoDB BSON 提供了除 JSON 之外其它数据类型的支持。 Drivers 提供了对这些数据类型在主机语言的本地化支持,mongo shell 也提供了一些帮助类来支持这些数据类型在 mongo JavaScript shell 中的使用。 请查阅 Extended JSON 参考了解其它信息。

类型

日期

mongo shell 提供了多种方法返回日期,要么通过字符串要么通过 Date 对象。

  • Date() 方法返回当前日期为一个字符串。

  • new Date() 构造函数返回一个使用 ISODate() 包装返回的 Date 对象。

  • ISODate() 构造函数返回一个使用 ISODate() 包装返回的 Date 对象。

内部来看, ref:document-bson-type-date 对象被存储为一个表示距离 Unix 纪元(1970年1月1日)毫秒数的64位整数,这就意味着一个可表示的日期范围:从距离过去到将来的29亿年。

返回日期为一个字符串

如果想要返回日期为一个字符串,使用 Date() 方法,如下面的示例所示:

var myDateString = Date();

如果想要输出变量的值,在shell中输入变量,如下所示:

myDateString

结果为 myDateString 的值:

Wed Dec 19 2012 01:03:25 GMT-0500 (EST)

如果想要验证类型,使用 ``typeof` 操作符,如下所示:

typeof myDateString

该操作返回 string

返回 Date

The mongo shell wraps objects of Date type with the ISODate helper; however, the objects remain of type Date.

下面的实例使用了 new Date() 构造函数以及 ISODate() 构造函数返回 Date 对象。

var myDate = new Date();
var myDateInitUsingISODateWrapper = ISODate();

你也可以使用 new` 操作符与 ``ISODate() 构造函数一起。

如果想要输出变量的值,在shell中输入变量,如下所示:

myDate

结果为包装在 ISODate() 帮助类中 myDateDate 值:

ISODate("2012-12-19T06:01:17.171Z")

如果想要验证类型,使用 instanceof 操作符,如下所示:

myDate instanceof Date
myDateInitUsingISODateWrapper instanceof Date

操作符两个都返回 true

ObjectId

The mongo shell provides the ObjectId() wrapper class around the ObjectId data type. To generate a new ObjectId, use the following operation in the mongo shell:

new ObjectId

查阅

ObjectId

NumberLong

The mongo shell treats all numbers as floating-point values by default. The mongo shell provides the NumberLong() wrapper to handle 64-bit integers.

NumberLong() 封装器接收long为字符串:

NumberLong("2090845886852")

下面的示例使用 NumberLong() 封装器写入到集合:

db.collection.insert( { _id: 10, calc: NumberLong("2090845886852") } )
db.collection.update( { _id: 10 },
                      { $set:  { calc: NumberLong("2555555000000") } } )
db.collection.update( { _id: 10 },
                      { $inc: { calc: NumberLong(5) } } )

检索文档以验证:

db.collection.findOne( { _id: 10 } )

在返回的文档中, calc 字段包含一个 NumberLong 对象:

{ "_id" : 10, "calc" : NumberLong("2555555000005") }

如果您使用了 $inc 来增加包含 NumberLong 对象的字段,增加为 浮点数,数据类型修改为 浮点值,如下面的示例所示:

  1. 使用 $inccalc 字段值增加 5mongo shell 将这些值处理为浮点型:

    db.collection.update( { _id: 10 },
                          { $inc: { calc: 5 } } )
    
  2. 检索更新的文档:

    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")

注解

如果想在 MongoDB driver 中使用 decimal 数据类型,请确保驱动程序版本支持该数据类型。

等式及排列顺序

Values of the decimal type are compared and sorted with other numeric types based on their actual numeric value. Numeric values of the binary-based double type generally have approximate representations of decimal-based values and may not be exactly equal to their decimal representations, so use the NumberDecimal() constructor when checking the equality of decimal values. Consider the following examples with the following documents in the numbers collection:

{ "_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>) 方法中时,返回下列结果:

查询

结果

{ “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.99 decimal 表示的文档。 double 的值被排除,因为它们与 9.99 decimal 表示的精确值不匹配。

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

检查 decimal 类型

如果想要测试 decimal 类型,使用 $type 操作符以及字符串, "decimal" 或者 19 ,其中 19decimal 类型的数值编号。

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 类型。