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

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...