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的音视频播放器 如果您不理解本…...

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

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]; 数组创建:“[ ]”中要给一个常量,不能使用变量 二、二维数组的初始化 int arr[3][4]{1,2,3,4};int arr[3][4]{{1,2},{4,5}};int arr[][4]{{2,3},{4,5}}; 前面的为行,…...

GUI加分游戏
需求目标 这个简单的游戏窗口包含一个得分标签和一个按钮。每次点击按钮时,得分增加1,并更新得分标签的显示。 效果 源码 /*** author lwh* date 2023/11/28* description 这个简单的游戏窗口包含一个得分标签和一个按钮。每次点击按钮时,…...
多线程的重要资料-信号量
(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基础篇:https://cyborg2077.github.io/2022/10/21/RedisBasic/ Redis实战篇:https://cyborg2077.github.io/2022/10/22/RedisPractice/ 一、手机号验证码注册登录 RandomUtil 生成定长随机数列 String code RandomUtil.ran…...

MX6ULL学习笔记 (一)交叉工具链的安装
前言: ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译,编译就需要编译 器,Ubuntu 自带的 gcc 编译器是针对 X86 架构的!而我们现在要编译的是 ARM 架构的代码,因为我们编译的代码是需要烧写到ARM板子…...
uni-app中的onLoad不执行
问题 想在onLoad()中发请求获取数据,却发现onLoad()根本不会执行 原因 这个页面没有在pages.json中配置,不属于uni-app中的页面 uni-app的文档也做出了说明,组件是无法使用页面级的onLoad等生命周期的 解决方法 uni-app除支持页面生命周…...

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

股票技术从初级到高级,从实盘进阶到摩尔缠论
一、教程描述 摩尔缠论是什么?一个伟大的缠论分支体系,由顶尖高手创立的缠论分支,这个顶尖高手,江湖上的代号为摩尔,可能是一个人,或者是一群人。摩尔缠论,基于缠论的核心思想与基础理论&#…...
力扣105. 从前序与中序遍历序列构造二叉树
栈 思路: 先序遍历:根、左子树、右子树;中序遍历:左子树、根、右子树;遍历先序遍历数组 prev,使用一个辅助栈缓存“根节点”;通过栈顶“根节点”与中序遍历数组 in 比较,确认是否到…...

Windows环境下的JDK安装与环境配置
一、JDK下载 1、打开Oracle官方网站下载页 Java Downloads | Oracle 中国 2、选择Java archive页,在版本列表中选择需要下载的版本 3、选择系统环境对应的版本,点击对应的下载按钮,弹出技术许可勾选框 4、勾选Oracle技术许可协议 5、输入Or…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
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…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...