【赵渝强老师】MongoDB的数据类型

简介: 本文介绍MongoDB中常用的数据类型,包括ObjectId、String、Boolean、Number、Array、Object、Date等,通过代码示例演示其用法与区别,帮助理解文档型数据库的数据存储机制。

b415.png

作为文档型NoSQL数据库的典型代表,MongoDB提供了丰富的数据类型,主要有:ObjectId、String、Boolean、Number、Arrays、Object、Null、Timestamp和Date。下面通过具体的示例来演示其中主要的数据类型以及它们的作用。


视频讲解如下:


一、 ObjectId


ObjectId类似关系型数据库中的主键,MongoDB使用它可以唯一确定集合中的一条文档。ObjectId是一个BSON类型字符串,其中包含了时间戳、机器标识码、进程ID和随机数。因此在分布式环境下,使用ObjectId可以避免MongoDB主键的冲突。当向MongoDB集合中插入文档时,可以通过使用字段_id来指定ObjectId;如果没有指定ObjectId,MongoDB会自动生成ObjectId。


下面通过一个简单的示例来进行演示。

(1)使用mongoshell连接到MongoDB服务器端,并切换到scott数据库中。

$ mongo
test@nosql11 1> use scott


(2)创建一张名叫test1的新集合,并向集合中插入一条文档。

scott@nosql11 2> db.test1.insertOne({name:"Tom",age:25})

# 输出的信息如下:
{
  "acknowledged" : true,
  "insertedId" : ObjectId("624a559df22c930516afc4e2")
}


(3)查询集合test1中的数据。

scott@nosql11 3> db.test1.find()

# 输出的信息如下:
{ "_id" : ObjectId("624a559df22c930516afc4e2"), "name" : "Tom", "age" : 25 }
# 由于在第(2)步插入文档时没有指定_id,MongoDB将会为插入的文档自动生成一个ObjectId。


二、 日期类型


在MongoDB中表示日期和时间可以通过Date和Timestamp两种不同的方式进行表示,MongoDB支持使用不同的方式来创建它们。下面通过具体的示例来进行演示。


(1)使用Date()插入一个字符串类型的时间数据。

scott@nosql11 5> Date()
Mon Apr 04 2025 10:37:19 GMT+0800 (CST)


(2)使用new Date()插入一个isodate类型的格林尼治标准时间数据。

scott@nosql11 6> new Date()
ISODate("2025-04-04T02:37:26.813Z")


(3)ISODate()与new Date()方式插入的时间数据类似。

scott@nosql11 7> ISODate()
ISODate("2025-04-04T02:37:35.642Z")


三、 数值类型


MongoDB中表示数值类型的数据时可以使用不同的方式。例如,使用Double表示浮点数;而使用Integer表示一个整数。下面的语句将向MongoDB的表中各插入一个Integer类型和Double类型的数据。

scott@nosql11 12> db.test1.insertOne({x1:1,x2:3.14});


MongoDB还支持使用NumberLong、NumberInt和NumberDecimal来表示数值类型的数据。下表列举了它们之间的区别。

image.png


下面通过几个具体的示例来演示MongoDB在存储数值类型数据时的区别。

(1)创建一张新集合test2,并向集合中插入下面的测试数据。

scott@nosql11 7> db.test2.insert(
  [
  {_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'}
  ]
  );


(2)指定下面的查询条件查询集合中的数据。

scott@nosql11 8> db.test2.find({'val':9.99});

# 输出的信息如下:
{ "_id" : 2, "val" : 9.99, "Description" : "Double" }
# 条件{'val':9.99}将匹配Double类型的9.99;而不是NumberDecimal代表的9.99。


(3)如果要匹配NumberDecimal代表的9.99需要指定下面的查询条件。

scott@nosql11 9> db.test2.find({'val':NumberDecimal('9.99')});

# 输出的信息如下:
{ "_id" : 1, "val" : NumberDecimal("9.99"), "Description" : "Decimal" }


(4)指定下面的查询条件查询集合中的数据。

scott@nosql11 10> db.test2.find({'val':10});

# 输出的信息如下:
{ "_id" : 3, "val" : 10, "Description" : "Double" }
{ "_id" : 4, "val" : NumberLong(10), "Description" : "Long" }
{ "_id" : 5, "val" : NumberDecimal("10.0"), "Description" : "Decimal" }
# 对于整个数字10的匹配,将匹配所有的数据类型10。


(5)指定下面的查询条件查询集合中的数据。

scott@nosql11 11> db.test2.find({'val':NumberDecimal('10')});

# 输出的信息如下:
{ "_id" : 3, "val" : 10, "Description" : "Double" }
{ "_id" : 4, "val" : NumberLong(10), "Description" : "Long" }
{ "_id" : 5, "val" : NumberDecimal("10.0"), "Description" : "Decimal" }


四、 其他数据类型


对与MongoDB支持的其他几种数据类型,如String、Boolean、Arrays、Object,下面通过一个简单示例来进行演示。

scott@nosql11 12>  db.test3.insertOne(
  {
    _id:'stu001',
    name:'Jone',
    married:false,
    age:18,
    courses:[{cname:'语文',credit:4},
         {cname:'英语',credit:3}
        ]
  });
  
# 其中:
# name: 表示姓名,是一个字符串类型的数据。
# married:表示是否结婚,是一个Boolean布尔类型的数据。
# age:  表示年龄,是一个数值类型的数据。
# courses:表示课程列表,是一个数组类型的数据。而数组中的每一个元素又是一个对象,包含课程的名称和学分。


相关文章
|
9月前
|
存储 NoSQL MongoDB
阿里云MongoDB 8.0最新发布
MongoDB 8.0 在性能优化、工作负载管理、数据库扩展、安全性增强及向量搜索能力等方面实现了多项突破。新版本大幅提升主从复制效率,降低延迟,并支持灵活的分片迁移与在线重分片。同时,新增 query shape 和持久化索引过滤器功能,帮助用户精细化管理高并发场景。此外,社区版引入全文与向量搜索,助力 AI 应用开发。阿里云作为国内首家支持 MongoDB 8.0 的厂商,提供高可用、弹性扩展和智能运维等云原生特性,满足多样化业务需求。
767 26
|
2月前
|
Linux Docker 容器
【赵渝强老师】使用yum方式安装Docker
本文介绍如何使用yum方式在Linux系统中安装和管理Docker。通过yum可自动解决依赖问题并方便地进行软件包更新。首先测试网络连通性,然后执行yum命令安装Docker,启动并启用Docker服务,最后验证安装成功并查看版本信息。
199 4
|
传感器 存储 JSON
|
3月前
|
Ubuntu 安全 Linux
CentOS与Ubuntu
CentOS与Ubuntu代表两种开源哲学:前者稳重如山,追求企业级稳定;后者灵动如水,倡导快速创新。源自RHEL与Debian的不同血脉,塑造了它们在更新策略、安全机制与生态定位上的鲜明对比。CentOS深耕传统服务器领域,Ubuntu则领跑云原生与开发者社区。尽管技术趋同日益明显,二者仍以不同方式诠释着自由软件的多样性与包容性,共同推动Linux生态繁荣发展。
|
2月前
|
SQL 关系型数据库 Shell
Postgresql入门之psql用法详解(四)- 高级功能
psql 是 PostgreSQL 的交互式命令行工具,支持模式匹配、变量替换、SQL 插值、自定义提示符及行编辑功能。通过 `\d` 等元命令可按名称模式查看对象,支持通配符与正则表达式。变量可动态设置并安全插值到 SQL 中,提升脚本灵活性。提供丰富的环境变量与配置文件(如 `.psqlrc`)来自定义行为,兼容不同终端与编码环境,适用于本地或远程数据库管理。
|
9月前
|
传感器 人工智能 自然语言处理
火热邀测!DataWorks数据集成支持大模型AI处理
阿里云DataWorks数据集成新增大模型AI处理功能,支持在数据同步中无缝调用通义千问等AI模型,实现文本翻译、情感分析、摘要生成等功能。适用于电商客服、智能汽车、供应链、医疗、金融、法律及教育等多个场景,大幅提升数据处理效率与洞察深度。用户可通过自然语言配置,快速完成高级数据分析与处理,无需额外部署调试。立即申请测试资格,体验智能化数据处理!
1406 4
火热邀测!DataWorks数据集成支持大模型AI处理
|
8月前
|
存储 数据可视化 数据安全/隐私保护
【赵渝强老师】Docker的图形化管理工具
本文介绍了三种主流的Docker图形化管理工具:Docker UI、Portainer和Shipyard。Docker UI(现名UI for Docker)适合初学者,支持容器管理并可显示容器关系图;Portainer轻量级且功能全面,支持单机与集群管理;Shipyard专注于多主机集群管理,提供镜像、容器及节点管理功能,并包含engine和rethinkdb两个核心组件。文中还通过图文结合的方式展示了各工具的安装与使用方法。
653 4
【赵渝强老师】Docker的图形化管理工具
|
弹性计算 人工智能 运维
Terraform从入门到实践:快速构建你的第一张业务网络(上)
本次分享主题为《Terraform从入门到实践:快速构建你的第一张业务网络》。首先介绍如何入门和实践Terraform,随后演示如何使用Terraform快速构建业务网络。内容涵盖云上运维挑战及IaC解决方案,并重磅发布Terraform Explorer产品,旨在降低使用门槛并提升用户体验。此外,还将分享Terraform在实际生产中的最佳实践,帮助解决云上运维难题。
1028 1
Terraform从入门到实践:快速构建你的第一张业务网络(上)
|
存储 传感器 数据采集
influxDB使用客户端教程
influxDB使用客户端教程
2395 0
|
存储 分布式计算 Kubernetes
微服务想用好,先把分布式和微服务之间的关系搞清楚
微服务想用好,先把分布式和微服务之间的关系搞清楚
微服务想用好,先把分布式和微服务之间的关系搞清楚