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

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用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…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

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

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#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…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...