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

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

视频讲解如下
【赵渝强老师】MongoDB的数据类型

一、 ObjectId

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

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

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

javascript 复制代码
$ mongo
test@nosql11 1> use scott

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

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

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

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

javascript 复制代码
scott@nosql11 3> db.test1.find()

# 输出的信息如下:
{ "_id" : ObjectId("624a559df22c930516afc4e2"), "name" : "Tom", "age" : 25 }

# 由于在第(2)步插入文档时没有指定_id,MongoDB将会为插入的文档自动生成一个ObjectId。

二、 日期类型

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

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

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

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

javascript 复制代码
scott@nosql11 6> new Date()
ISODate("2025-04-04T02:37:26.813Z")

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

javascript 复制代码
scott@nosql11 7> ISODate()
ISODate("2025-04-04T02:37:35.642Z")

三、 数值类型

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

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

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

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

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

javascript 复制代码
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)指定下面的查询条件查询集合中的数据。

javascript 复制代码
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需要指定下面的查询条件。

javascript 复制代码
scott@nosql11 9> db.test2.find({'val':NumberDecimal('9.99')});

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

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

javascript 复制代码
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)指定下面的查询条件查询集合中的数据。

javascript 复制代码
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,下面通过一个简单示例来进行演示。

javascript 复制代码
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:表示课程列表,是一个数组类型的数据。而数组中的每一个元素又是一个对象,
           包含课程的名称和学分。
相关推荐
余槐i6 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
数据库小学妹6 小时前
PostgreSQL表膨胀怎么办?autovacuum清不动的根因与排查命令
数据库·postgresql·表膨胀·mvcc·数据库运维
mister_guo6 小时前
MySQL-1267错误:排序规则冲突的原因与解决方案
数据库·mysql
骇客野人7 小时前
在麒麟操作系统上 分别安装 jdk1.8, 达梦数据库,redis ,memcache 的操作实施方案和步骤
数据库·redis·memcached
美狐美颜SDK开放平台9 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
花间相见10 小时前
【计算基础|MySQL01】【上手】安装连接、数据类型与建库建表
数据库·后端
花间相见10 小时前
【计算基础|MySQL02】【上手】SQL 增删改查
数据库·后端
ITxiaobing202310 小时前
IP 库与 AppsFlyer 国家/地区数据不一致,如何系统地对账?
数据库·网络协议·tcp/ip
这个DBA有点耶11 小时前
从时间到语义:时序数据库与向量数据库的核心机制、选型与多模融合趋势
数据库·mysql·架构
对空六课11 小时前
RFM分层边界变化的回溯计算
大数据·服务器·前端·数据库·人工智能·算法·数据分析