当前位置: 首页 > news >正文

MongoDB-BSON 协议与类型

主页.png

前言:

MongoDB 是一个高性能、无模式的 NoSQL 数据库,广泛应用于大数据处理和实时数据存储。作为一个数据库系统,MongoDB 的核心之一就是其使用的 BSON(Binary JSON)格式,它用于存储数据以及在客户端和数据库之间传输数据。

什么是 BSON?

BSON(Binary JSON)是一种用于数据存储和交换的二进制格式。它是 JSON 格式的扩展,提供了对更复杂数据类型的支持。BSON 的设计目标是提供一种轻量级的、具有高效二进制编码的方式来存储和传输数据,尤其是针对 MongoDB 的存储需求。

BSON 与 JSON 的差异

尽管 BSON 是 JSON 的二进制扩展,它们之间有若干重要差异:

1、二进制格式:BSON 采用二进制格式,这使得它比 JSON 更加紧凑,存储和传输效率更高。
2、数据类型支持:BSON 支持 JSON 不支持的一些数据类型,例如二进制数据、日期类型、正则表达式等。
3、自描述结构:BSON 格式本身包含字段的类型信息,读取时无需额外的解析。
4、大小和性能:由于 BSON 是二进制格式,相较于 JSON(纯文本),它在存储和读取时通常具有更高的性能和更小的占用空间。

BSON 数据类型

BSON 提供了许多扩展 JSON 数据类型,满足 MongoDB 数据库对数据表示和存储的需求。以下是 BSON 支持的一些常见数据类型。

1. Null (null)
  • 描述:表示一个空值或无效值,类似于 JSON 中的 null。

  • 示例:
    javascriptCopy Code

    { “field”: null }

2. 布尔值 (Boolean)
  • 描述:BSON 使用 true 或 false 来表示布尔值。

  • 示例:
    javascriptCopy Code

    { “isActive”: true }

3. 整数类型 (Int32 和 Int64)
  • 描述:BSON 支持两种整数类型:32位整数 (Int32) 和 64位整数 (Int64),分别表示较小和较大的整数。MongoDB 自动根据数据的范围选择存储形式。

  • 示例:
    javascriptCopy Code

    { “age”: 25 } // 默认为 Int32
    { “timestamp”: NumberLong(“1622549093000”) } // Int64

4. 浮动类型 (Double)
  • 描述:BSON 使用 64 位的 IEEE 754 双精度浮动值表示浮动类型。适用于需要高精度的计算或存储。

  • 示例:
    javascriptCopy Code

    { “price”: 99.99 }

5. 字符串 (String)
  • 描述:BSON 中的字符串是 UTF-8 编码的文本数据类型,类似于 JSON 中的字符串。

  • 示例:
    javascriptCopy Code

    { “name”: “MongoDB” }

6. 二进制数据 (BinData)
  • 描述:BSON 支持存储二进制数据,通常用于存储图像、音频等非文本数据。

  • 示例:
    javascriptCopy Code

    { “file”: BinData(0, “binarydata”) }

7. 日期 (Date)
  • 描述:BSON 使用 64 位整数来表示日期和时间,精确到毫秒。

  • 示例:
    javascriptCopy Code

    { “createdAt”: new Date() }

8. 对象Id (ObjectId)
  • 描述:ObjectId 是 MongoDB 的默认主键类型。它是一个 12 字节的唯一标识符,生成方式基于时间戳、机器 ID、进程 ID 和一个随机数。

  • 示例:
    javascriptCopy Code

    { “_id”: ObjectId(“507f1f77bcf86cd799439011”) }

9. 数组 (Array)
  • 描述:BSON 允许在一个字段中存储多个值,这些值可以是任何类型。与 JSON 数组类似。

  • 示例:
    javascriptCopy Code

    { “tags”: [“database”, “NoSQL”, “MongoDB”] }

10. 嵌套文档 (Embedded Document)
  • 描述:BSON 支持嵌套文档(即文档中的文档),允许存储复杂的结构化数据。

  • 示例:
    javascriptCopy Code

    {
    “address”: {
    “street”: “123 Main St”,
    “city”: “New York”
    }
    }

11. 正则表达式 (RegEx)
  • 描述:BSON 支持存储正则表达式,这是 JSON 不具备的功能。在 MongoDB 中,正则表达式常用于模式匹配查询。

  • 示例:
    javascriptCopy Code

    { “pattern”: /abc/i }

  1. JavaScript 代码 (JavaScript)
  • 描述:BSON 支持存储 JavaScript 代码,可以包含函数和脚本,通常用于动态计算和操作。

  • 示例:
    javascriptCopy Code

    { “code”: function() { return 42; } }

13. 最小值/最大值 (MinKey 和 MaxKey)
  • 描述:MinKey 和 MaxKey 是 BSON 中的特殊类型,分别表示最小值和最大值,常用于在查询中进行极限值比较。

  • 示例:
    javascriptCopy Code

    { “minValue”: MinKey }
    { “maxValue”: MaxKey }

BSON 编码与解码

BSON 在存储数据时以二进制的形式进行编码,使得数据能够高效存储和传输。当客户端或服务器需要与数据库交互时,它们会将 BSON 数据进行编码和解码。MongoDB 提供了内置的序列化和反序列化机制,使用如 bson 库来处理 BSON 格式的编码和解码。

编码过程:

类型描述:每个 BSON 文档的每个字段都有类型描述符,指示该字段的数据类型。
键和值对:每个字段都由一个键(字符串类型)和一个值(可以是任何 BSON 支持的数据类型)组成。
文档结束符:BSON 文档以一个特定的结束符标记结束,确保数据结构完整性。

解码过程:

读取类型:在解码时,MongoDB 根据类型描述符来确定字段值的数据类型。
返回文档:解码后的 BSON 数据将转化为 JavaScript 对象或其他语言的对应数据结构。

BSON 协议与性能优化

MongoDB 使用 BSON 协议来优化性能,尤其是在读写性能和存储效率方面。与 JSON 相比,BSON 提供了更小的存储空间和更快的读取速度。通过支持二进制数据和日期类型等,BSON 能够有效存储各种应用场景中的数据。

压缩与存储:BSON 支持多种优化存储方式,包括压缩技术,这使得它在大数据量处理时更加高效。
索引优化:由于 BSON 格式的文档结构灵活,MongoDB 可以根据数据字段进行高效索引,提升查询性能。

结论

BSON 协议是 MongoDB 数据存储和传输的核心,它结合了高效的二进制编码、丰富的数据类型和灵活的存储结构。通过支持多种数据类型,BSON 使得 MongoDB 在处理各种复杂数据时非常高效。

在这里插入图片描述

相关文章:

MongoDB-BSON 协议与类型

前言: MongoDB 是一个高性能、无模式的 NoSQL 数据库,广泛应用于大数据处理和实时数据存储。作为一个数据库系统,MongoDB 的核心之一就是其使用的 BSON(Binary JSON)格式,它用于存储数据以及在客户端和数据…...

学习threejs,使用VideoTexture实现视频Video更新纹理

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️VideoTexture 视频纹理 二、…...

怎么获取键值对的键的数值?

问: 通过paelData.cardMap.C0002112可以获取到Cooo2112里面的数据,但是有时候接口返回的不是C0002112而是C0002093或者其他值,请问我该怎么写? 后端返回的数据是这样的: cardMap: { C0002112: { name: Item 1, va…...

数据结构排序算法详解

数据结构排序算法详解 1、冒泡排序(Bubble Sort)2、选择排序(Selection Sort)2、插入排序(Insertion Sort) 1、冒泡排序(Bubble Sort) 原理:越小的元素会慢慢“浮”到数…...

在Linux设置postgresql开机自启动,创建一个文件 postgresql-15.service

在Linux设置postgresql开机自启动,创建一个文件 postgresql-15.service 在Linux设置postgresql开机自启动,创建一个文件 postgresql-15.service1. 创建 systemd 服务文件2. 编辑服务文件3. 保存并退出4. 重新加载 systemd 配置5. 启动 PostgreSQL 服务6.…...

【kafka】消息队列的认识,Kafka与RabbitMQ的简单对比

什么是消息队列? 消息队列(Message Queue,简称 MQ)是一个在不同应用程序、系统或服务之间传递数据的机制。 它允许系统间异步地交换信息,而无需直接交互,确保消息的可靠传输。 想象一下,你正在…...

ProjectSend 身份认证绕过漏洞复现(CVE-2024-11680)

0x01 产品描述: ProjectSend 是一个开源文件共享网络应用程序,旨在促进服务器管理员和客户端之间的安全、私密文件传输。它是一款相当流行的应用程序,被更喜欢自托管解决方案而不是 Google Drive 和 Dropbox 等第三方服务的组织使用。0x02 漏洞描述: ProjectSend r1720 之前…...

Android笔记(三十四):onCreate执行Handler.post在onResume后才能执行?

背景 偶然发现一个点,就是在onCreate执行Handler.post在onResume后才执行,以下是测试代码 多次运行的结果一致,为什么execute runnable不是在onCreate和onResume之间执行的呢,带着疑问撸了一遍Activity启动流程 关键源码分析 …...

关闭模组的IP过滤功能

关闭模组的IP过滤功能 关闭模组的IP过滤功能 本脚本用于关闭模组的IP过滤功能&#xff0c;关闭后&#xff0c; 源地址不是终端IP的数据包&#xff0c;也可以被模组转发给网络 关闭模组的IP过滤功能 cat > /usr/bin/ipfilter << "EOF"echo -e "ATCFUN…...

算法分析与设计复习笔记

插入排序 1. void insert_sort(int A[ ],int n) 2. { 3. int a,i,j; 4. for (i1;i<n;i) { 5. a A[ i ]; 6. j i – 1; 7. while (j>0 && A[j]>a) { 8. A[ j…...

vue-amap 高德地图

vue-amap是一套基于Vue 2/vue3和高德地图的地图组件 vue-amap 高德地图2.0版本的对应vue3...

Numpy基础练习

import numpy as np 1.创建一个长度为10的一维全为0的ndarray对象,然后让第5个元素等于1 n np.zeros(10,dtypenp.int32) n[4] 12.创建一个元素从10到49的ndarray对象 n np.arrange(10,50)3.将第2题的所有元素位置反转 n[::-1]使用np.random.random创建一个10*10的ndarray对象…...

一番赏小程序定制开发,打造全新抽赏体验平台

随着盲盒的热潮来袭&#xff0c;作为传统的潮玩方式一番赏也再次受到了大家的关注&#xff0c;市场热度不断上升&#xff01; 一番赏能够让玩家百分百中奖&#xff0c;商品种类丰富、收藏价值高&#xff0c;拥有各种IP&#xff0c;从而吸引着各个圈子的粉丝玩家&#xff0c;用…...

【前端】将vue的方法挂载到window上供全局使用,也方便跟原生js做交互

【前端】将vue的方法挂载到window上供全局使用&#xff0c;也方便跟原生js做交互 <template><div><el-button click"start">调用方法</el-button></div> </template> <script> // import { JScallbackProc } from ./JScal…...

Oracle查询优化:高效实现仅查询前10条记录的方法与实践

在 Oracle 中&#xff0c;实现仅查询前10条记录的四种方法 1. 使用 ROWNUM 查询 ROWNUM 是 Oracle 中的伪列&#xff0c;用于限制返回的行数。 SELECT * FROM table_name WHERE condition AND ROWNUM < 10;condition&#xff1a;查询条件。ROWNUM < 10&#xff1a;限制…...

go语言编译问题

go编译 goproxy地址 阿里云 https://mirrors.aliyun.com/goproxy/七牛云 https://goproxy.cn/开源版 https://goproxy.io/nexus社区 https://gonexus.dev/启用 Go Modules 功能 go env -w GO111MODULEon配置 GOPROXY 环境变量&#xff0c;以下三选一 七牛 CDN go env -w …...

mobi文件转成pdf

将 MOBI 文件转换为 PDF 格式通常涉及两个步骤&#xff1a; 解析 MOBI 文件&#xff1a;需要提取 MOBI 文件的内容&#xff08;文本、图片等&#xff09;。将提取的内容转换为 PDF&#xff1a;将 MOBI 文件的内容渲染到 PDF 格式。 可用工具 kindleunpack 或 mobi&#xff1…...

MobaXterm解决中文显示乱码问题

1 问题 打开MobaXterm时&#xff0c;会显示中文乱码。 2 解决方法 右键点击会话&#xff0c;在弹出菜单中选择“编辑会话”&#xff0c;如下&#xff1a; 选择终端字体设置&#xff0c;如下&#xff1a; 字符集换成ISO-8859-1&#xff0c;如下&#xff1a; 网上有说用…...

西门子 SINAMICS G120 变频器借助 ProfiNet 转 EtherCAT 实现与汇川 H5U 通讯实例

一&#xff0e; 案例背景 随着智能制造理念的推进&#xff0c;设备之间的协同工作变得越来越重要。例如&#xff0c;在机器人自动化焊接生产线中&#xff0c;电机驱动的焊接机器人需要与其他设备协同工作&#xff0c;这就要求负责电机控制的变频器和控制整个生产线流程的PLC能…...

流媒体之linux下离线部署FFmpeg 和 SRS

前言 用户对网络做了限制&#xff0c;只能访问指定的网址&#xff0c;和没网没啥区别&#xff0c;导致无法连接外网&#xff0c;无法获取安装包&#xff0c;还有一些编译需要的开源工具 用户需要用平台查看库房的海康摄像头实时监控&#xff0c;只能在库房里一台纯净的ubantu…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...