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

MongoDB——golang操作(链接,CURD,聚合)

MongoDB golang操作

中文文档

链接

package mainimport ("context""fmt""log""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options"
)func main() {// 设置客户端连接配置clientOptions := options.Client().ApplyURI("mongodb://192.168.157.142:27017").SetAuth(options.Credential{Username: "admin",Password: "12346",},)// 连接到MongoDBclient, err := mongo.Connect(context.TODO(), clientOptions)if err != nil {log.Fatal(err)}// 检查连接err = client.Ping(context.TODO(), nil)if err != nil {log.Fatal(err)}fmt.Println("Connected to MongoDB!")// Close the connection once no longer needederr = client.Disconnect(context.TODO())if err != nil {log.Fatal(err)} else {fmt.Println("\nConnection to MongoDB closed.")}
}

CURD

package mainimport ("context""fmt""log""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options"
)type Student struct {Name stringAge  int
}func main() {// 设置客户端连接配置clientOptions := options.Client().ApplyURI("mongodb://192.168.157.142:27017")// 连接到MongoDBclient, err := mongo.Connect(context.TODO(), clientOptions)if err != nil {log.Fatal(err)}// 检查连接err = client.Ping(context.TODO(), nil)if err != nil {log.Fatal(err)}fmt.Println("Connected to MongoDB!\n")// 获取集合collection := client.Database("test").Collection("trainers")// 插入文档s1 := Student{"小红", 12}s2 := Student{"小兰", 10}s3 := Student{"小黄", 11}// 使用collection.InsertOne()方法插入一条文档记录insertResult, err := collection.InsertOne(context.TODO(), s1)if err != nil {log.Fatal(err)}fmt.Println("\nInserted a single document: ", insertResult.InsertedID)// 使用collection.InsertMany()方法插入多条文档记录:students := []interface{}{s2, s3}insertManyResult, err := collection.InsertMany(context.TODO(), students)if err != nil {log.Fatal(err)}fmt.Println("Inserted multiple documents: ", insertManyResult.InsertedIDs)// 更新文档// 需要一个筛选器文档来匹配数据库中的文档,并需要一个更新文档来描述更新操作。你可以使用bson.D类型来构建筛选文档和更新文档filter := bson.D{{"name", "小兰"}}update := bson.D{{"$inc", bson.D{{"age", 1},}},}// updateone()方法允许你更新单个文档 通过下面的语句找到小兰,给他增加一岁updateResult, err := collection.UpdateOne(context.TODO(), filter, update)if err != nil {log.Fatal(err)}fmt.Printf("\nMatched %v documents and updated %v documents.\n", updateResult.MatchedCount, updateResult.ModifiedCount)// 查找文档// 创建一个Student变量用来接收查询的结果var result Student// 这个方法返回一个可以解码为值的结果err = collection.FindOne(context.TODO(), filter).Decode(&result)if err != nil {log.Fatal(err)}fmt.Printf("\nFound a single document: %+v\n", result)// 查询多个// 将选项传递给Find()findOptions := options.Find()findOptions.SetLimit(3) //用options包设置一个限制以便只返回两个文档findOptions.SetSkip(1)// 定义一个切片用来存储查询结果var results []*Student// 把bson.D{{}}作为一个filter来匹配所有文档// 此方法返回一个游标。游标提供了一个文档流,你可以通过它一次迭代和解码一个文档。当游标用完之后,应该关闭游标。cur, err := collection.Find(context.TODO(), bson.D{{}}, findOptions)if err != nil {log.Fatal(err)}// 查找多个文档返回一个光标// 遍历游标允许我们一次解码一个文档for cur.Next(context.TODO()) {// 创建一个值,将单个文档解码为该值var elem Studenterr := cur.Decode(&elem)if err != nil {log.Fatal(err)}fmt.Printf("Found multiple document: %+v\n", elem)results = append(results, &elem)}if err := cur.Err(); err != nil {log.Fatal(err)}// 完成后关闭游标cur.Close(context.TODO())fmt.Printf("\nFound multiple documents (array of pointers): %+v\n\n", results)// 删除文档// 使用collection.DeleteOne()或collection.DeleteMany()删除文档。如果你传递bson.D{{}}作为过滤器参数,它将匹配数据集中的所有文档。还可以使用collection. drop()删除整个数据集。// 删除名字是小黄的那个deleteResult1, err := collection.DeleteOne(context.TODO(), bson.D{{"name", "小黄"}})if err != nil {log.Fatal(err)}fmt.Printf("\nDeleted %v documents in the trainers collection\n", deleteResult1.DeletedCount)// 删除所有deleteResult2, err := collection.DeleteMany(context.TODO(), bson.D{{}})if err != nil {log.Fatal(err)}fmt.Printf("\nDeleted %v documents in the trainers collection\n", deleteResult2.DeletedCount)err = collection.Drop(context.TODO())if err != nil {log.Fatal(err)} else {fmt.Println("\nDrop document")}// Close the connection once no longer needederr = client.Disconnect(context.TODO())if err != nil {log.Fatal(err)} else {fmt.Println("\nConnection to MongoDB closed.")}
}

聚合

package mainimport ("context""fmt""log""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options"
)type IdDept struct {Dept stringAge  int
}type ResultDept struct {_id IdDept// Pers          intDeptAvgSalary int
}func main() {// 设置客户端连接配置clientOptions := options.Client().ApplyURI("mongodb://192.168.157.142:27017")// 连接到MongoDBclient, err := mongo.Connect(context.TODO(), clientOptions)if err != nil {log.Fatal(err)}// 检查连接err = client.Ping(context.TODO(), nil)if err != nil {log.Fatal(err)}fmt.Println("Connected to MongoDB!\n")// 获取集合persons := client.Database("test").Collection("persons")// Start Aggregation Example 1/*获取 6 个年龄大于 22 周岁的用户,其中如果薪水如果小于 1000,直接将薪水上调到 4000,前面一步做好后,需要排除年龄最大的一个,求出每个部门,相同年龄的员工的平均薪水,并得到薪水最高的三个人。思路:1、投影出年龄(age),部门(dept),薪水(salary)字段2、查出年龄大于 22 周岁的员工3、以年龄倒序进行排序4、限制返回 7 条数据,并跳过一条数据5、以部门年龄进行分组,并求出平均分6、以上一步的平均分在进行倒序排序7、然后再返回 3 条数据*/pipeline := []bson.M{bson.M{"$project": bson.M{"age":    1,"dept":   1,"salary": 1}},bson.M{"$addFields": bson.M{"salary": bson.M{"$cond": bson.M{"if":   bson.M{"$lt": []interface{}{"$salary", 1000}},"then": bson.M{"$add": []interface{}{"$salary", 4000}},"else": "$salary"}}}},bson.M{"$match": bson.M{"age": bson.M{"$gt": 22}}},bson.M{"$sort": bson.M{"age": -1}},bson.M{"$skip": 1},bson.M{"$limit": 7},bson.M{"$group": bson.M{"_id": bson.M{"dept":"$dept", "age":"$age"},"avg": bson.M{"$avg": "$salary"}}},bson.M{"$sort": bson.M{"avg": -1}},bson.M{"$limit": 3},}cur, err := persons.Aggregate(context.TODO(), pipeline)if err != nil {log.Fatal(err)}// 定义一个切片用来存储查询结果var results []*ResultDept// 查找多个文档返回一个光标// 遍历游标允许我们一次解码一个文档for cur.Next(context.TODO()) {// 创建一个值,将单个文档解码为该值// var elem ResultDeptvar elem map[string]interface{}err := cur.Decode(&elem)if err != nil {log.Fatal(err)}fmt.Printf("Found multiple document: %+v\n", elem)// results = append(results, &elem)}if err := cur.Err(); err != nil {log.Fatal(err)}// 完成后关闭游标cur.Close(context.TODO())fmt.Printf("\nAggregate multiple documents (array of pointers): %+v\n\n", results)// Close the connection once no longer needederr = client.Disconnect(context.TODO())if err != nil {log.Fatal(err)} else {fmt.Println("\nConnection to MongoDB closed.")}
}

相关文章:

MongoDB——golang操作(链接,CURD,聚合)

MongoDB golang操作 中文文档 链接 package mainimport ("context""fmt""log""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options" )func main() {// 设置客户端连接配置clientOptions : o…...

音视频项目—基于FFmpeg和SDL的音视频播放器解析(十八)

介绍 在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…...

绿色能源守护者:光伏运维无人机

随着我国太阳能光伏产业被纳入战略性新兴产业,光伏发电成为实现“双碳”目标的关键之一。在政策支持下,光伏产业维持高速发展,为迎接“碳达峰、碳中和”大势注入了强大动力。在这一背景下,复亚智能与安徽一家光伏企业合作&#xf…...

i已学赋能智慧教育时代的幼儿教育

伴随“教育数字化战略行动”的深入开展,智慧教育正式成为国家战略。智慧教育延伸至家校社教育的每个阶段。当前,为适应智慧教育发展趋势,我国制定了《中国教育现代化2035》《教育部关于加强“三个课堂”应用的指导意见》《教育信息化2.0行动计划》等文件。幼儿作为智慧教育、智…...

[栈迁移+ret滑梯]gyctf_2020_borrowstack

题目来源buuctf——gyctf_2020_borrowstack 参考链接https://www.shawroot.cc/2097.html 题目信息ubuntu16、64位 第一个read仅溢出一个机器字长,需要栈迁移 解题步骤栈偏移到全局变量bank中,ret2libcgadget 关键步骤 ret滑梯 第二个payload需要添…...

PTA:用函数实现从数列中删除一个数

题目: 编写一个函数实现:删除n个元素的数列中下标为k的元素。 测试程序将输入一个下标值,调用本函数,删除数列{1,4,13,9,6,11,18,14,25}中该下标位置的元素,并输出删除后的数列。 函数接口定义: void de…...

C++设计模式之工厂模式(中)——工厂模式

工厂模式 工厂模式介绍示例示例使用运行结果工厂模式与简单工厂模式区别 工厂模式 工厂模式在简单工厂模式的基础之上进行了改进。当需要生产的产品种类增加,可以通过新增子类工厂来生产,没有破坏程序设计原则中的开放封闭原则。 介绍 工厂模式先抽象…...

关于el-table的二次封装及使用,支持自定义列内容

关于el-table的二次封装及使用 table组件 <template><el-table ref"tableComRef" :data"tableData" border style"width: 100%"><el-table-column v-if"tableHeaderList[0]?.type selection" type"selection&…...

【Vue】Vue3 配置全局 scss 变量

variables.scss $color: #0c8ce9;vite.config.ts // 全局css变量css: {preprocessorOptions: {scss: {additionalData: import "/styles/variables.scss";,},},},.vue 文件使用...

C语言—二维数组

一、二维数组的创建 int arr[3][4];char arr[3][5];double arr[2][4]; 数组创建&#xff1a;“[ ]”中要给一个常量&#xff0c;不能使用变量 二、二维数组的初始化 int arr[3][4]{1,2,3,4};int arr[3][4]{{1,2},{4,5}};int arr[][4]{{2,3},{4,5}}; 前面的为行&#xff0c…...

GUI加分游戏

需求目标 这个简单的游戏窗口包含一个得分标签和一个按钮。每次点击按钮时&#xff0c;得分增加1&#xff0c;并更新得分标签的显示。 效果 源码 /*** author lwh* date 2023/11/28* description 这个简单的游戏窗口包含一个得分标签和一个按钮。每次点击按钮时&#xff0c;…...

多线程的重要资料-信号量

(1)https://www.cnblogs.com/ike_li/p/8984186.html (2)C#关于AutoResetEvent的使用介绍 | 康瑞部落 (3)AutoResetEvent用法(一)_autoresetevent 的用法-CSDN博客 (4)c++ - Is there an easy way to implement AutoResetEvent in C++0x? - Stack Overflow (5)...

区块链相关技术、概念以及技术实现过程中的一些关键问题 Smart Contracts and Blockchains

作者:禅与计算机程序设计艺术 1.简介 2017年底,区块链已经成为众多投资人和技术人员最关注的话题之一。随着现实世界的不断复杂化、数字货币的流行以及IoT设备的普及,加密数字货币市场正变得越来越活跃。由于区块链具有去中心化、不可篡改、透明性、高并发等特点,使其在金…...

黑马点评Redis笔记

黑马点评Redis笔记 Redis基础篇&#xff1a;https://cyborg2077.github.io/2022/10/21/RedisBasic/ Redis实战篇&#xff1a;https://cyborg2077.github.io/2022/10/22/RedisPractice/ 一、手机号验证码注册登录 RandomUtil 生成定长随机数列 String code RandomUtil.ran…...

MX6ULL学习笔记 (一)交叉工具链的安装

前言&#xff1a; ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译&#xff0c;编译就需要编译 器&#xff0c;Ubuntu 自带的 gcc 编译器是针对 X86 架构的&#xff01;而我们现在要编译的是 ARM 架构的代码&#xff0c;因为我们编译的代码是需要烧写到ARM板子…...

uni-app中的onLoad不执行

问题 想在onLoad()中发请求获取数据&#xff0c;却发现onLoad()根本不会执行 原因 这个页面没有在pages.json中配置&#xff0c;不属于uni-app中的页面 uni-app的文档也做出了说明&#xff0c;组件是无法使用页面级的onLoad等生命周期的 解决方法 uni-app除支持页面生命周…...

EFAK-v3.0.1版部署与使用

一、前言 EFAK&#xff08;(Eagle For Apache Kafka&#xff0c;以前称为Kafka Eagle&#xff09;用于在使用 Topic 的情况下监控 Kafka 集群。包含Offset 的产生、Lag的变化、Partition的分布、Owner、Topic的创建以及修改的时间等信息。 二、环境&安装包 官方下载连接E…...

股票技术从初级到高级,从实盘进阶到摩尔缠论

一、教程描述 摩尔缠论是什么&#xff1f;一个伟大的缠论分支体系&#xff0c;由顶尖高手创立的缠论分支&#xff0c;这个顶尖高手&#xff0c;江湖上的代号为摩尔&#xff0c;可能是一个人&#xff0c;或者是一群人。摩尔缠论&#xff0c;基于缠论的核心思想与基础理论&#…...

力扣105. 从前序与中序遍历序列构造二叉树

栈 思路&#xff1a; 先序遍历&#xff1a;根、左子树、右子树&#xff1b;中序遍历&#xff1a;左子树、根、右子树&#xff1b;遍历先序遍历数组 prev&#xff0c;使用一个辅助栈缓存“根节点”&#xff1b;通过栈顶“根节点”与中序遍历数组 in 比较&#xff0c;确认是否到…...

Windows环境下的JDK安装与环境配置

一、JDK下载 1、打开Oracle官方网站下载页 Java Downloads | Oracle 中国 2、选择Java archive页&#xff0c;在版本列表中选择需要下载的版本 3、选择系统环境对应的版本&#xff0c;点击对应的下载按钮&#xff0c;弹出技术许可勾选框 4、勾选Oracle技术许可协议 5、输入Or…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

ui框架-文件列表展示

ui框架-文件列表展示 介绍 UI框架的文件列表展示组件&#xff0c;可以展示文件夹&#xff0c;支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项&#xff0c;适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...

TCP/IP 网络编程 | 服务端 客户端的封装

设计模式 文章目录 设计模式一、socket.h 接口&#xff08;interface&#xff09;二、socket.cpp 实现&#xff08;implementation&#xff09;三、server.cpp 使用封装&#xff08;main 函数&#xff09;四、client.cpp 使用封装&#xff08;main 函数&#xff09;五、退出方法…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...

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的边框是在图里…...