runoops.com

mongo Shell 数据类型

类型

Date 日期

所述mongoshell提供了各种方法来返回日期,无论是作为一个字符串或作为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.用于$inccalc字段增加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版的新功能。

默认情况下,mongoShell将所有数字视为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.99double类型的值 被排除在外,因为它们与的decimal表示形式的确切值不匹配9.99

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

检查decimal类型

要测试decimal类型,请使用$type字符串别名"decimal"或的操作符19,该数字为该decimal类型的数字代码 。

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

mongoShell中检查类型

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

instanceof

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

例如,以下操作测试该_id字段是否为type的实例ObjectId

mydoc._id instanceof ObjectId

操作返回true

typeof

typeof 返回字段的类型。

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

typeof mydoc._id

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