【Go - mongodb - bson / schema】

Bson是什么

bson 是 MongoDB 使用的一种二进制编码格式,全称为 Binary JSON。它用于存储和传输 JSON 风格的文档数据。bson 提供了一种高效的方式来表示 JSON 数据,同时支持更多的数据类型,例如日期和二进制数据。

在 Go 语言中,bson 是由 MongoDB 官方驱动包 go.mongodb.org/mongo-driver/bson 提供的一个包,用于处理 BSON 数据。这个包提供了多种类型和函数来编码和解码 BSON 数据。

Bson常用类型与示例

  • bson.D:有序的 BSON 文档,适用于需要保持字段顺序的场景。
  • bson.M:无序的 BSON 文档,适用于不需要保持字段顺序的场景。
  • bson.A:BSON 数组,适用于表示数组的场景。
  • bson.E:键值对,常用于构建 bson.D

以下是一个包含bson.D,bson.M,bson.A,bson.E的示例

package mainimport ("context""fmt""log""time""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options"
)func main() {// 连接到 MongoDBclient, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017"))if err != nil {log.Fatal(err)}defer client.Disconnect(context.TODO())// 选择数据库和集合collection := client.Database("testdb").Collection("users")// 使用 bson.D 构建查询filterD := bson.D{{Key: "name", Value: "John"},{Key: "age", Value: bson.D{{Key: "$gt", Value: 25},}},}// 使用 bson.M 构建查询filterM := bson.M{"name": "John","age": bson.M{"$gt": 25,},}// 使用 bson.D 构建查询,包含 bson.E 和 bson.AfilterA := bson.D{{Key: "name", Value: "John"},{Key: "tags", Value: bson.A{"developer", "golang"}},}// 查询数据var resultsD []bson.Mvar resultsM []bson.Mvar resultsA []bson.Mctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)defer cancel()// bsonDcursorD, err := collection.Find(ctx, filterD)if err != nil {log.Fatal(err)}defer cursorD.Close(ctx)// bsonMcursorM, err := collection.Find(ctx, filterM)if err != nil {log.Fatal(err)}defer cursorM.Close(ctx)// bsonE// bsonAcursorA, err := collection.Find(ctx, filterA)defer cursorA.Close(ctx)if err = cursorD.All(ctx, &resultsD); err != nil {log.Fatal(err)}if err = cursorM.All(ctx, &resultsM); err != nil {log.Fatal(err)}if err = cursorA.All(ctx, &resultsA); err != nil {log.Fatal(err)}// 打印结果fmt.Println("Results using bson.D:", resultsD)fmt.Println("Results using bson.M:", resultsM)fmt.Println("Results using bson.D with bson.A:", resultsA)
}

如何定义表结构schema

虽然MongoDB 是no-sql类型,但在使用的时候,表结构一般是固定的,且在代码中为了更清晰的展示表结构 以及 其字段。所以一般都是 定义声明其schema,以下是个示例,

package mainimport ("context""fmt""log""sync""time""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/bson/primitive""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options"
)// User 表结构定义
type User struct {// 使用omitempty来表示某些字段是可选的ID    primitive.ObjectID `bson:"_id,omitempty"`Name  string             `bson:"name"`Age   int                `bson:"age"`Email string             `bson:"email,omitempty"`
}// 获取MongoDB客户端的单例
var singlestonMongoClient *mongo.Client
var once sync.Oncefunc getSinglestonMongoClient() *mongo.Client {once.Do(func() {uri := "mongodb://localhost:27017"client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri))if err != nil {panic(err)}singlestonMongoClient = client})return singlestonMongoClient
}func main() {client := getSinglestonMongoClient()if client == nil {panic("client is nil")}defer func() {if err := client.Disconnect(context.TODO()); err != nil {panic(err)}}()// 选择数据库和集合collection := client.Database("testdb").Collection("users")// 查询用户数据var users []Userctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)defer cancel()cursor, err := collection.Find(ctx, bson.M{})if err != nil {log.Fatal(err)}defer cursor.Close(ctx)// 遍历数据for cursor.Next(ctx) {var user Userif err := cursor.Decode(&user); err != nil {log.Fatal(err)}users = append(users, user)}if err := cursor.Err(); err != nil {log.Fatal(err)}// 打印用户数据for _, user := range users {fmt.Printf("User: %+v\n", user)}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/877400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

低代码开发平台:加速企业数字化转型的利器

前言 在软件开发领域,传统的编码方式往往复杂且耗时,对技术团队的技能要求高。随着企业数字化转型的加速,低代码开发平台作为一种新兴的解决方案,逐渐成为许多组织提升开发效率、降低技术门槛的利器。本文将深入探讨低代码开发的…

【Drools】(三)基于业务数据动态调用 DRL 规则文件:详细实现与测试指南

基于业务数据动态调用 DRL 规则文件:详解与实战 在业务规则管理中,DRL 文件(Drools Rule Language 文件)用于定义和执行业务规则。通过动态调用 DRL 文件,我们可以根据不同的业务场景灵活配置和执行定制化的规则&…

【中项】系统集成项目管理工程师-第8章 信息安全工程-8.3工程体系架构

前言:系统集成项目管理工程师专业,现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试,全称为“全国计算机与软件专业技术资格(水平)考试”&…

MongoDB 基础知识

一、为什么学习MongoDB MongoDB解决Mysql 的“三高”问题: 1.对数据库高并发写入需求 2.对海量数据高效率存储访问需求 3.对数据库高扩展和高可用的需求 MongoDB 实际应用: 1.社交场景,比如朋友圈,附近的人的地点的存储 2.…

Python for循环迭代原理(迭代器 Iterator)

在使用Python时,我们经常会使用for循环来访问容器对象(列表、字符、字典等)中的元素。其幕后实际是通过迭代协议来完成的,迭代是一种依次访问对象中元素的方式,for循环在对象上调用iter()函数生成一个迭代器&#xff0…

wc -l 统计文件中的行数

wc -l 是一个常用的命令行工具,用于统计文件中的行数。它的使用格式是: wc -l [文件名] 主要用途是计算指定文件中的行数。例如,如果有一个名为 example.txt 的文件,要查看它有多少行,可以运行: wc -l exam…

16 html网页服务和nginx服务

第十六次7.29 1.静态页面 1安装httpd [rootweb ~]# yum -y install httpd 2.真机访问页面 [rootweb html]# echo "静态html文件" > index.html 传入照片再次访问 静态资源,根据开发着保存在项目资源目录中的路径访问静态页面的资源 2.Apache 1.安…

【Docker】Namespace 空间隔离实战

一、实战目的 了解隔离能力并不是 Docker 提供的,而是操作系统内核提供基本能力。 二、基础知识 1、dd 命令详解 Linux dd 命令用于读取、转换并输出数据。 dd 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、…

淘宝商家电话采集 淘宝店铺爬虫软件使用教程

淘宝商家电话采集:淘宝店铺爬虫软件使用教程 淘宝作为中国最大的电子商务平台之一,拥有众多的商家和店铺。有时候我们需要获取特定店铺的联系电话,以便进行合作洽谈或者其他目的。本文将介绍如何使用Python编写一个淘宝店铺爬虫软件来采集商…

有效组织离散变量:指针数组在C语言中的应用

把离散变量组织起来,访问起来更加方便,无需一个个变量单独赋值。 如modbus读写reg, 把a\b\c\d实时变化分散的变量组织成一个数组reg,方便获取 相当于变量的内存地址池 int main() {int a 10, b 20, c 30, d 40;int i;int *re…

Vue3----扩展 element Plug card

扩展 element Plug card 增加全屏&#xff0c;折叠操作项 核心代码 <template><div class"cc-card-component"><el-card v-if"state.isShow" :class"state.class" :bodyStyle"bodyStyle" :shadow"props.shadow…

英语:四、冠词

1、冠词的概述 &#xff08;1&#xff09;冠词的分类 根据冠词的用法&#xff0c;它可以分为定冠词、不定冠词和零冠词。 定冠词 the 不定冠词 a an 零冠词 名词前面没有冠词 &#xff08;2&#xff09;冠词的位置 a、放在名词之前 一般情况下&#xff0c;冠词置于…

Vmwar保姆级安装与配置

文章目录 一、官方下载1.访问VMware官方网站&#xff1a;2.选择产品&#xff1a;3.下载安装包&#xff1a; 二、VMware的安装1.运行安装程序2.选择安装位置3.选择安装选项4.完成安装 三、启动VMware Workstation Pro并配置虚拟机1.创建新的虚拟机&#xff1a;2.配置虚拟机硬件 …

中间件 - 使用Eureka进行微服务注册与发现

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有疑问和建议&#xff0c;请私信或评论留言&#xff01; 前言 在微服务架构中…

【C#】.net core 6.0 webapi 使用core版本的NPOI的Excel读取数据以及保存数据

欢迎来到《小5讲堂》 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景读取并保存NPOI信息NPOI 插件介绍基本功能示例代码写入 Excel 文件…

前端JavaScript处理小数精度问题(最佳实践)

前言&#xff1a; 针对于小数精度问题&#xff0c;本次我们主要推荐两种方式&#xff0c;一种是简单的函数封装&#xff0c;一种是使用第三方库big.js。 方法一&#xff1a; 自封装函数搭配parseFloat和toFixed解决小数精度问题&#xff0c;仅适用于解决一般性小数精度问题&…

Linux脚本:自动检测的bash脚本,用于检查linux的系统安全性

目录 一、要求 二、脚本介绍 1、脚本内容 2、脚本解释 &#xff08;1&#xff09;函数定义 &#xff08;2&#xff09;防火墙状态检查 &#xff08;3&#xff09;SELinux/AppArmor状态检查 &#xff08;4&#xff09;SSH配置检查 &#xff08;5&#xff09;用户账户数…

android 设备,启用 adb 调试

1 开启开发者选项 如果在android user版本&#xff0c;通过 USB 连接设备上使用 adb&#xff0c;需要在设备启用 USB 调试。通常开发者选项默认&#xff0c;处于隐藏状态。 1.1 开启开发者选项 在设备上&#xff0c;找到build信息选项&#xff0c;列表显示软件版本号&#…

【云原生】Kubernetes----k8s免密使用harbor私有仓库

目录 引言 一、搭建Harbor仓库 &#xff08;一&#xff09;关闭防护 &#xff08;二&#xff09;安装docker &#xff08;三&#xff09;安装docker-compose &#xff08;四&#xff09;安装harbor-offline 1.获取安装包 2.修改配置文件 3.启动服务 4.登录仓库验证 二…

营销人看巴黎奥运会,看到了什么?

不同的人眼中的巴黎奥运会是不一样的&#xff1a;环保人士关注奥运场馆的绿色设计&#xff0c;以及赛事期间对可再生能源的利用&#xff1b;旅游博主用镜头捕捉巴黎奥运会每一个精彩瞬间&#xff1b;社会学家在巴黎奥运会看到多元文化的交流与融合…… 那么营销人在巴黎奥运会…