MongoDB学习整理(三)--数据类型介绍

本文是学习MongDb:The Definitive Guide(Mongodb权威指南)一书做的浅显的整理,请大神们多多指教。

Json是一种简单的数据表示方式,仅有6种数据类型。null、数据、字符串、数组、对象、布尔。由于数据表示的数据类型少,所以Json的表现能力也有限。
MongoDb使用的数据类型是BSON,BSON在保留JSON数据键值对特性的基础上又增加了一些数据类型,如日期,正则等。下面介绍MongoDB的数据类型:

  • null
    null用于表示空值或不存在的键值,{x:null}

  • 布尔

  • 数字
    JavaScript只支持一种数据类型,64位浮点数。因为MongoDb中有32位整数,64位整数,64位浮点数三种数字。所以shell必须绕过JavaScript限制。默认情况下,shell中的数字都会被MongoDb当作双精度数。所以尽量不要在shell下覆盖整个文档。
    有些64位整数并不能被表示成64位浮点数,所以当在shell中查看时,字会以内嵌文档的形式显示。如文档键integer的值为64位整数3,那么显示结果为:

    {_id:ObjectId(""),"myInteger":{"floatApprox":3}}
    floatApprox是一种特殊的内嵌文档,可以作为值和文档来操作
    >doc.myInteger+1
    4
    >doc.myInteger.floagApprox
    3
    上述表示可能不准确,要是内嵌文档只有一个键,那么实际上这个值是准确的。
    如果插入的64位整数不能准确的表示为双精度数,那么shell会添加两个键”top”和”bottom”,分别表示高32位和低32位,如:插入9223372036854775807,显示如下:
    {
    _id:ObjectId(""),
    myInteger:{
    "floatApprox":9223372036854775807
    "top":2147483647,
    "bottom":4294967295
    }
    }
    32位整数都可以精确的表示为64位浮点数

  • 字符串
    Utf8字符串都可以表示成字符串类型的数据,{“x”: “char”}

  • 符号
    shell不支持符号类型,符号类型数据会被转为字符串存储。

  • 对象id
    对象id是文档的12字节唯一id,{“_id”: ObjectId()}
    Mongodb中的文档必须有一个_id键,这个键的值可以是任意类型的,默认是ObjectId类型的。不同的机器都可以用全局唯一的同种方法生成ObjectId类型。
    MongoDb设计的初衷就是分布式的,所以处理多个节点是一个核心要求。ObjectId类型会在分布式环境中容易生成。
    ObjectId占12字节空间,每个字节由两位十六进制数字组成,是一个24位长的字符串。
    ObjectId是由时间戳,机器码,进程号,计数器生成。

    前4个字节是由标准纪元开始的时间戳,精确到秒级
    接下来3个字节是所在机器的唯一标识符,通常是机器散列值
    后2个字节是产生ObjectId的进程标识符
    最后3个字节是计数据器
    前9个字节保证了同一秒不同机器不同进程产生的ObjectId唯一,后3字节确保相同进程同一秒产生的ObjectId也是不同的,同一秒钟最多允许每个进程产生256的3次方(16777216)个ObjectId

    ObjectId是由MongoDb自动生成。MongoDb把生成ObjectId的任务交给客户端,这样减轻数据库扩展的负担。同时客户端生成ObjectId,驱动程序可以提供更多的Api。如果驱动程序允许服务器端生成ObjectId,那么将需要单独的查询,以确认插入的ObjectId值是否存在。

  • 日期
    日期是从标准纪元开始的毫秒数,不存时区,{“x”: new Date())}。
    JavaScript中Date对象用作MongoDb的日期类型,通常调用Date(…)会返回日期的字符串类型,调用new Date(…)才会返回真正的日期对象,这是JavaScript本身的特性,不是MongoDb的特性。MongoDb创建新的日期时会调用new Date(),而不是Date()。
  • 正则表达式
    文档中存储的正则表达式采用JavaScript正则表达式语法,{“x”: /baz/i}
  • 代码
    文档中可以包含JavaScript代码,{“x”: function(){/* */}}
  • 二进制数据
    二进制数据可以由任意字节的串组成,不可shell中不可以使用。
  • 最大值
    BSON包括一个特殊的类型,表示可能的最大值,shell中不能使用。
  • 最小值
    BSON包括一个特殊的类型,表示可能的最小值,shell中不能使用。
  • 未定义
    文档中可以使用未定义类型(null,undefined).null表示没有这个对象或定义,undefined表示有该对象或定义但不应该有值。
  • 数组
    值的集合或列表可以表示成数组,{“x”: [“a”,”b”,”c”]}
    数据可以包含不同数据类型的元素,MongoDb能理解数组结构,并知道如何深入数组内部操作其内容,这样就能用内容对数组进行查询及构建索引了
  • 内嵌文档
    文档可以包含别的文档,也可以做为值嵌入到父文档中,{“x”:{“a”:”b”}}
    同数组一样,Mongodb也能理解内嵌文档的结构,并深入其中构建索引,执行查询,或者更新。
    内嵌文档可能会带来数据的冗余,最好将同类的文档放到另一个集合中操作。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值