MongoDB的go SDK使用集锦

news2024/11/26 20:29:15

在上一章解读MongoDB官方文档获取mongo7.0版本的安装步骤与基本使用介绍了如何使用mongo shell操作mongo数据库,接下来介绍如何使用sdk来操作数据库,这里以go语言为例,其他语言请查看源文档mongo docs

在这里插入图片描述
Quick Start

  • 内置数据结构

MongoDB是存储JSON数据结构的数据库,但是json在mongo的存储格式却是二进制形式存储。和程序的数据结构一样这个二进制不经包含了数据的结构也包含了数据类型,被称作BSON(二进制编码的JSON)。

mongo的go driver中提供了内置的解析数据的数据结构分别为:

在这里插入图片描述

D:BSON的有序document切片表示

M:BSON的哈希表表示map结构

A:BSON数组

E:D类型的一个单元素

bson.D{{"foo", "bar"}, {"hello", "world"}, {"pi", 3.14159}}
bson.M{"foo": "bar", "hello": "world", "pi": 3.14159}
bson.A{"bar", "world", 3.14159, bson.D{{"qux", 12345}}}

这些内置的数据结构既可以做参数又可以做返回值。

  • 客户端

go get go.mongodb.org/mongo-driver/mongo

package main

import (
	"context"
	"fmt"
	"log"

	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
)

func main() {
	// 创建客户端
	c, err := mongo.Connect(context.Background(), options.Client().ApplyURI("mongodb://localhost:32768"))
	if err != nil {
		log.Println("CONNECT ERR", err)
		return
	}
	// 绑定collecttion 
	collecttion := c.Database("test").Collection("inventory")

	var result bson.M
	err2 := collecttion.FindOne(context.Background(), bson.D{{"qty", 100}, {}}).Decode(&result)
	if err2 != nil {
		log.Println("COLL ERR", err2)
		return
	}
	fmt.Println(result)

}

  • 内置数据结构的CURD

coll := c.Database("test").Collection("inventory")

查找

// 单个查询
var result bson.D
err = coll.FindOne(context.TODO(), bson.D{{"firstName", Mike}}).Decode(&result)

// 多个查询
cursor, err := coll.Find(context.TODO(), bson.D{{"age", bson.D{{"$gte", 46}}}})

添加

// 单个添加
result, err := coll.InsertOne(
    context.TODO(),
    bson.D{
        {"animal", "Dog"},
        {"breed", "Beagle"}
    }
)

// 批量添加
docs := []interface{} {
    bson.D{{"firstName", "Erik"}, {"age", 27}},
    bson.D{{"firstName", "Mohammad"}, {"lastName", "Ahmad"}, {"age", 10}},
    bson.D{{"firstName", "Todd"}},
    bson.D{{"firstName", "Juan"}, {"lastName", "Pablo"}}
 }

result, err := coll.InsertMany(context.TODO(), docs)

修改

// 单个修改
result, err := coll.UpdateOne(
    context.TODO(),
    bson.D{{"firstName", "Erik"}},
    bson.D{{"$set", bson.D{{"age", 28}}}}
)

// 批量修改
result, err := coll.UpdateMany(
    context.TODO(),
    bson.D{{"age", bson.D{{"$gte", 58}}}},
    bson.D{{"$set", bson.D{{"description", "Senior"}}}}
)
fmt.Printf("The number of modified documents: %d\n", result.ModifiedCount)

删除

// 单个删除
result, err := coll.DeleteOne(
    context.TODO(),
    bson.D{{"firstName", "Xiao"}}
)

// 批量删除
results, err := coll.DeleteMany(
    context.TODO(),
    bson.D{{"age", bson.D{{"$lte", 12}}}}
)
  • 结构体变量

在go语言中使用最多的是结构体,因此无需使用内置数据结构。


// 选择要插入数据的集合
collection := client.Database("test").Collection("users")

// 创建要插入的数据结构体
user := User{
    Name:  "Alice",
    Email: "alice@example.com",
    Age:   25,
}

// 将数据结构体转换为 BSON 格式
userBSON, err := bson.Marshal(user)
if err != nil {
    panic(err)
}

// 插入数据
_, err = collection.InsertOne(context.Background(), userBSON)
if err != nil {
    panic(err)
}
type bih struct {
	Id   string   `bson:"_id"`
	Item string   `bson:"item"`
	Qty  int      `bson:"qty"`
	Size size     `bson:"size"`
	Tags []string `bson:"tags"`
}
type size struct {
	H   int     `bson:"h"`
	W   float32 `bson:"w"`
	Uom string  `bson:"uom"`
}

collecttion := c.Database("test").Collection("inventory")
var tmp bih
err2 := collecttion.FindOne(context.Background(), bson.D{{"qty", 100}, {}}).Decode(&tmp)
	if err2 != nil {
		log.Println("COLL ERR", err2)
		return
	}
fmt.Println(tmp)

在这里插入图片描述

Json和结构体是一致的,只要使用bson标签即可。

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

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

相关文章

24 静动态库

首先创建两个函数的头文件和源文件 最后的main函数 #include <stdio.h> #include "print.h" #include "sum.h"int main() {Print("时间");printf("%d\n", sum(3, 5));return 0; }将函数编译成.o文件 make生成文件 make he…

ENVI实战—一文学会使用传感器自带信息配准工具进行几何校正

实验1&#xff1a;学会使用传感器自带信息配准工具 目的&#xff1a;利用ENVI的传感器自带信息配准工具&#xff0c;掌握几何校正的一般方法。 过程&#xff1a; 1.对MODIS影像进行校正&#xff1a; ①读取影像&#xff1a;打开文件&#xff0c;点击“打开为”&#xff0c;…

windows下已经创建好了虚拟环境,但是切换不了的解决方法

用得多Ubuntu&#xff0c;今天用Windows重新更新anaconda出问题&#xff0c;重新安装之后&#xff0c;打开pycharm发现打开终端之后&#xff0c;刚开始是ps的状态&#xff0c;后面试了网上改cmd的方法&#xff0c;终端变成c盘开头了 切换到虚拟环境如下&#xff1a;目前的shell…

IDA动态调试

动态调试 这里我使用测试程序是buuctf逆向题目中的第一题easyre.exe 将其拖进IDA中打开 在调试前要选择调试器&#xff0c;在菜单栏找到调试器&#xff0c;如下选择之后点击确定。 在启动调试前下断点 下好断电到调试器里点击启动进程 会有警告信息&#xff0c;选择是即可…

ARP代理

10.1.0.1/8 和10.2.0.1/8是在同一个网段 10.1.0.2/16 和10.2.0.2/16 不在同一个网段 10.1.0.1/8 和10.1.0.2/16 是可以ping通的 包发出来了&#xff0c;报文有发出来&#xff0c;目的地址是广播包 广播请求&#xff0c;发到路由器的接口G 0/0/0 target不是本接口&#xff0…

Linux 序列化、反序列化、实现网络版计算器

目录 一、序列化与反序列化 1、序列化&#xff08;Serialization&#xff09; 2、反序列化&#xff08;Deserialization&#xff09; 3、Linux环境中的应用实例 二、实现网络版计算器 Sock.hpp TcpServer.hpp Jsoncpp库 Protocol.hpp MyDaemon.hpp CalServer.cc Ca…

3.1 iHRM人力资源 - 组织架构、树形结构、添加子部门

iHRM人力资源 - 组织架构 文章目录 iHRM人力资源 - 组织架构一、展示数据-树形组件1.1 组件说明1.2 树组件自定义结构获取作用域数据1.2.1 说明1.2.2 页面代码1.2.3 获取组织架构数据-api 1.3 效果图1.4 修改树形结构bug 二、添加子部门2.1 表单弹层2.1.1 下拉菜单点击事件2.1.…

中国科学院大学学位论文LaTeX模版

Word排版太麻烦了&#xff0c;公式也不好敲&#xff0c;推荐用LaTeX模版&#xff0c;全自动 官方模版下载位置&#xff1a;国科大sep系统 → \rightarrow → 培养指导 → \rightarrow → 论文 → \rightarrow → 论文格式检测 → \rightarrow → 撰写模板下载百度云&#…

Vitis HLS 学习笔记--readVec2Stream 函数-探究

目录 1. 高效内存存取的背景 2. readVec2Stream() 参数 3. 函数实现 4. 总结 1. 高效内存存取的背景 在深入研究《Vitis HLS 学习笔记--scal 函数探究》一篇文章之后&#xff0c;我们对于scal()函数如何将Y alpha * X这种简单的乘法运算复杂化有了深刻的理解。本文将转向…

前端console用法分享

console对于前端人员来讲肯定都不陌生&#xff0c;相信大部分开发者都会使用console来进行调试&#xff0c;但它能做的绝不仅限于调试。 最常见的控制台方法 作为开发者&#xff0c;最常用的 console 方法如下&#xff1a; 控制台打印结果&#xff1a; 今天我分享的是一些 co…

Vue3项目中快速引入ElementUI框架

ElementUI介绍 ElementUI是一个强大的PC端UI组件框架&#xff0c;它不依赖于vue&#xff0c;但是却是当前和vue配合做项目开发的一个比较好的ui框架&#xff0c;其包含了布局&#xff08;layout)&#xff0c;容器&#xff08;container&#xff09;等各类组件&#xff0c;基本上…

qutip,一个高级的 Python 量子力学研究库!

目录 前言 安装 特性 基本功能 量子态的创建和操作 量子态的测量 示例代码 动力学模拟 高级功能 退相干和噪声模拟 控制和优化 量子信息学工具 实际应用场景 量子态演化研究 量子计算机模拟 量子纠错协议 总结 前言 大家好&#xff0c;今天为大家分享一个高级的 Pytho…

【C++对于C语言的扩充】函数重载、引用以及内联函数

文章目录 &#x1f680;前言&#x1f680;函数重载注意&#xff1a;✈️为什么C可以实现函数重载&#xff0c;而C语言却不行呢&#xff1f; &#x1f680;引用✈️引用的特性✈️C中为什么要引入引用✈️引用与指针的区别 &#x1f680;内联函数✈️内联函数特性 &#x1f680;…

ClickHouse--17--聚合函数总结

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 环境1.创建clickhouse表2.插入数据 函数(1)count&#xff1a;计算行数(2)min&#xff1a;计算最小值(3)max&#xff1a;计算最大值(4)sum&#xff1a;计算总和&…

创新实训2024.04.11日志:self-instruct生成指令

1. 参考文献 代码&#xff1a;https://github.com/yizhongw/self-instruct论文&#xff1a;https://arxiv.org/abs/2212.10560 2. 前沿论文阅读 2.1. self-instruct技术的优势 作者在文章中提到&#xff1a; The recent NLP literature has witnessed a tremendous amount …

STM32H7的8个串口fifo收发(兼容232和485)

STM32H7的8个串口fifo收发&#xff08;兼容232和485&#xff09; 串口硬件串口时序串口高级特性同步和异步的区别单工、半双工、全双工的区别 STM32H78个串口fifo驱动定义数据结构uart_fifo.huart驱动包括中断配置等 应用示例RS485深入理解 仅供学习。 USART 的全称是 Universa…

【C++】开始使用stack 与 queue

送给大家一句话&#xff1a; 忍受现实给予我们的苦难和幸福&#xff0c;无聊和平庸。 – 余华 《活着》 开始使用queue 与 stack 1 前言2 stack与queue2.1 stack 栈2.2 queue 队列2.3 使用手册 3 开始使用Leetcode 155.最小栈牛客 JZ31 栈的弹出压入序列Leetcode 150.逆波兰表达…

Mac版2024 CleanMyMac X 4.15.2 核心功能详解 cleanmymac这个软件怎么样?cleanmymac到底好不好用?

近些年伴随着苹果生态的蓬勃发展&#xff0c;越来越多的用户开始尝试接触Mac电脑。然而很多人上手Mac后会发现&#xff0c;它的使用逻辑与Windows存在很多不同&#xff0c;而且随着使用时间的增加&#xff0c;一些奇奇怪怪的文件也会占据有限的磁盘空间&#xff0c;进而影响使用…

leetcode热题100.爬楼梯(从二进制到快速幂)

Problem: 70. 爬楼梯 文章目录 题目思路Code复杂度 题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方…

Oracle+RAC静默安装系列(基于RHEL9/国产/麒麟/华为欧拉的生产案例)

由风哥发布的 OracleRAC静默安装系列&#xff08;基于RHEL9/国产/麒麟/华为欧拉的生产案例&#xff09;系列&#xff0c;适合运维人员/数据库/开发人员&#xff0c;可以用于业务生产环境。 为满足想快速安装布署Oracle数据库的学员&#xff0c;风哥特别设计的一套比较全面的全命…