当前位置: 首页 > 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…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式

pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图&#xff0c;如果边框加在dom上面&#xff0c;pdf-lib导出svg的时候并不会导出边框&#xff0c;所以只能在echarts图上面加边框 grid的边框是在图里…...