数据类型

MongoDB 服务器使用 BSON格式支持一些额外的数据类型,这些数据类型不可用JSON 格式。与遗留mongoshell 相比,MongoDB Shell ( mongosh) 的类型处理更符合 MongoDB 使用的默认类型司机。

mongosh本文档重点介绍了旧 shell 和shell之间类型使用的变化mongo。见 扩展 JSON有关受支持类型的更多信息的参考。

日期

mongosh提供各种方法来返回日期,可以是字符串形式,也可以是Date对象形式:

  • Date()以字符串形式返回当前日期的方法。
  • new Date()``Date使用 包装器返回对象的构造函数ISODate()
  • ISODate()``Date使用 包装器返回对象的构造函数ISODate()

对象ID

mongosh提供ObjectId()围绕 对象ID数据类型。要生成新的 ObjectId,请使用以下操作mongosh

new ObjectId

从 1.8.0 开始,ObjectId包装器不再接受:

  • ObjectId.prototype.generate
  • ObjectId.prototype.getInc
  • ObjectId.prototype.get_inc
  • ObjectId.getInc

提示:

也可以看看:

ObjectId()

整数32

如果一个数字可以转换为 32 位整数,mongosh则将其存储为Int32. 如果不是,mongosh默认将数字存储为Double. Int32 存储在中的数值mongosh默认情况下会存储Double在 shell 中 mongo

Int32()构造函数可用于显式指定 32 位整数。

db.types.insertOne(
   {
       "_id": 1,
       "value": Int32("1"),
       "expectedType": "Int32"
   }
)

警告:

如果您使用旧 shell和旧shell连接到同一个集合,默认值Int32和类型可能会存储不一致。Double``mongosh``mongo

Long

Long()构造函数可用于显式指定 64 位整数。

db.types.insertOne(
   {
      "_id": 3,
      "value": Long("1"),
      "expectedType": "Long"
   }
)

笔记:

在遗产中mongoshellNumberLong()接受字符串或整数值。在 中mongoshNumberLong() 只接受字符串值。长的()提供管理与 64 位值之间的转换的方法。

十进制128

十进制128()values 是基于十进制的 128 位浮点数,可精确模拟十进制舍入。

此功能适用于处理 货币数据,例如财务、税收和科学计算。

Decimal128 BSON类型 使用 IEEE 754 decimal128 浮点编号格式,支持 34 位十进制数字(即有效数字)和 −6143 至 +6144 的指数范围。

db.types.insertOne(
   {
       "_id": 5,
       "value": Decimal128("1"),
       "expectedType": "Decimal128"
   }
)

平等和排序顺序

该类型的值Decimal128根据其实际数值与其他数值类型进行比较和排序。基于二进制Double类型的数值通常具有基于十进制值的近似表示,并且可能不完全等于它们的十进制表示。

时间戳

MongoDB 使用一个 BSON 时间戳在内部操作日志. 该Timestamp类型的工作方式类似于 Java Timestamp 类型。使用日期涉及日期的操作类型。

签名Timestamp有两个可选参数。

Timestamp( { "t": <integer>, "i": <integer> } )
范围 类型 默认 定义
t 整数 当前时间自UNIX 时代。 选修的。以秒为单位的时间。
i 整数 1个 选修的。用于在给定秒内有多个操作时进行排序。i如果没有使用则没有效果 t

有关使用示例,请参阅为新文档添加时间戳, 创建自定义时间戳。

类型检查

使用$type查询运算符或检查对象构造函数以确定类型。

Javascripttypeof运算符返回通用值,例如 numberorobject而不是更具体的Int32or ObjectId

Javascript 的instanceof运算符不可靠。例如, instanceof将服务器响应中的 BSON 值分配给与用户提供的值不同的基类。

有关使用示例,请参阅类型检查$type()使用构造函数进行类型检查。

例子

以字符串形式返回日期

要以字符串形式返回日期,请使用Date()方法,如以下示例所示:

var myDateString = Date();

要打印变量的值,请在 shell 中键入变量名称,如下所示:

myDateString

结果是 的值myDateString

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

要验证类型,请使用typeof运算符,如下所示:

typeof myDateString

操作返回string

返回Date

mongosh``Date用助手包装类型 的对象ISODate;然而,对象仍然是类型Date

下面的示例同时使用了new Date()构造函数和 ISODate()返回Date对象的构造函数。

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

您也可以将new运算符与ISODate()构造函数一起使用。

要打印变量的值,请在 shell 中键入变量名称,如下所示:

myDate

结果是包装在 助手中Date的值:myDate``ISODate()

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

要验证类型:

var myDate = ISODate("2021-03-21T06:00:00.171Z")
Object.prototype.toString.call(myDate) === "[object Date]"

操作返回true

数值类型

考虑 types集合:

{ _id: 1, value: 1, expectedType: 'Int32' },
{ _id: 2, value: Long("1"), expectedType: 'Long' },
{ _id: 3, value: 1.01, expectedType: 'Double' },
{ _id: 4, value: Decimal128("1.01"), expectedType: 'Decimal128' },
{ _id: 5, value: 3200000001, expectedType: 'Double' }

db.types.find( <QUERY> ) 此表显示相应命令的结果<QUERY>。类型名称和别名在BSON 类型页。

询问 结果
{ "value": { $type: "int" }} { _id: 1, value: 1, expectedType: 'Int32'}
{ "value": { $type: "long" }} { _id: 2, value: Long("1"), expectedType: 'Long'}
{ "value": { $type: "decimal" }} { _id: 4, value: Decimal128("1"), expectedType: 'Decimal128'}
{ "value": { $type: "double" }} { _id: 3, value: 1.01, expectedType: 'Double'}{ _id: 5, value: 3200000001, expectedType: 'Double'}
{ "value": { $type: "number" }} { _id: 1, value: 1, expectedType: 'Int32'}{ _id: 2, value: Long("1"), expectedType: 'Long'}{ _id: 3, value: 1.01, expectedType: 'Double'}{ _id: 4, value: Decimal128("1.01"), expectedType: 'Decimal128'}{ _id: 5, value: 3200000001, expectedType: 'Double'}
{ "value": 1.01} { _id: 3, value: 1.01, expectedType: 'Double'}
{ "value": 1} { _id: 1, value: 1, expectedType: 'Int32'}{ _id: 2, value: Long("1"), expectedType: 'Long'}

查询{ "value": 1.01 }隐式搜索 Double的表示1.01。文件_id: 4是一个 Decimal128所以它没有被选中。

但是请注意,这{ "value": 1 }会同时返回Int32Long类型。

默认数值类型一致性

考虑typeExample集合。该集合包含两个相同的文档,{ "a": 1 }. 第一个文档是在遗留mongoshell 中创建的,第二个文档是在 mongosh.

我们可以使用$type聚合管道中的运算符以查看在每个 shell 中分配的类型。

db.typeExample.aggregate(
  [
    {
       $project:
         {
           "valueType":
             {
               "$type": "$a"
             },
           "_id": 0
         }
    }
  ]
)

在旧mongoshell 中创建的第一个文档中,该值存储为double. 在mongosh文档中,值存储为 type int

[
  {
     valueType: 'double'  // inserted in legacy mongo shell
  },
  {
     valueType: 'int'     // inserted in mongosh
  }
]

为新文档添加时间戳

使用Timestamp()不带参数使用默认设置插入多个文档

db.flights.insertMany(
   [
      { arrival: "true", ts: Timestamp() },
      { arrival: "true", ts: Timestamp() },
      { arrival: "true", ts: Timestamp() }
   ]
)

运行db.flights.find({})以查看时间戳。请注意,即使所有三个条目都在同一秒内被标记,但每个条目的间隔都会增加。

[
   {
      _id: ObjectId("6114216907d84f5370391919"),
      arrival: 'true',
      ts: Timestamp({ t: 1628709225, i: 1 })
   },
   {
      _id: ObjectId("6114216907d84f537039191a"),
      arrival: 'true',
      ts: Timestamp({ t: 1628709225, i: 2 })
   },
   {
      _id: ObjectId("6114216907d84f537039191b"),
      arrival: 'true',
      ts: Timestamp({ t: 1628709225, i: 3 })
   }
]

创建自定义时间戳

使用自定义参数插入具有特定 Timestamp.

此操作将三个文档插入集合flights并使用UNIX 纪元1627811580将时间设置ts为 2021 年 8 月 1 日格林威治标准时间 9:53。

db.flights.insertMany(
   [
      { arrival: "true", ts: Timestamp(1627811580, 10) },
      { arrival: "true", ts: Timestamp(1627811580, 20) },
      { arrival: "true", ts: Timestamp(1627811580, 30) }
   ]
)

生成的文档如下所示:

[
   {
      _id: ObjectId("6123d8315e6bba6f61a1031c"),
      arrival: 'true',
      ts: Timestamp({ t: 1627811580, i: 10 })
   },
   {
      _id: ObjectId("6123d8315e6bba6f61a1031d"),
      arrival: 'true',
      ts: Timestamp({ t: 1627811580, i: 20 })
   },
   {
      _id: ObjectId("6123d8315e6bba6f61a1031e"),
      arrival: 'true',
      ts: Timestamp({ t: 1627811580, i: 30 })
   }
]

类型检查$type()

$type查询运算符接受与数据类型对应的字符串别名或数字代码。看 BSON 类型获取 BSON 数据类型列表及其相应的数字代码。

例如,这些类型检查Decimal128是等效的:

db.types.find( { "value": { $type: "decimal" } } )
db.types.find( { "value": { $type: 19 } } )

使用构造函数进行类型检查

检查对象constructor以确定类型。例如,输出db.collection.find()是一个Cursor

var findResults = db.housing.find({"multiUnit": true} )
findResults.constructor.name     // Returns the type

翻译:韩鹏帅

原文:Data Types

Copyright © 上海锦木信息技术有限公司 all right reserved,powered by Gitbook文件修订时间: 2023-09-01 17:10:26

results matching ""

    No results matching ""