前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go学习——使用MongoDB

Go学习——使用MongoDB

作者头像
传说之下的花儿
发布于 2023-04-16 07:09:47
发布于 2023-04-16 07:09:47
65500
代码可运行
举报
运行总次数:0
代码可运行

MongoDB

MongoDB是一个高性能,开源,无模式的文档型数据库,是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,采用的是类似json的bjson格式来存储数据,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向 对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

下表将帮助您更容易理解Mongo中的一些概念:

SQL术语/概念

MongoDB术语/概念

解释/说明

database

database

数据库

table

collection

数据库表/集合

row

document

数据记录行/文档

column

field

数据字段/域

index

index

索引

table joins

表连接,MongoDB不支持

primary key

primary key

主键,MongoDB自动将_id字段设置为主键

添加mongodb依赖

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

连接MongoDB:

链接数据库 func Connect(ctx context.Context, opts ...*options.ClientOptions)

Connect 需要两个参数,一个context和一个options.ClientOptions对象

简单的链接实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 设置客户端选项
clientOptions := options.Client().ApplyURI("mongodb://user:password@localhost:27017")
// 连接 MongoDB
client, 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!")

上面代码的流程就是 创建 链接对象 option 和 context , 然后写入 mongo.Connect , Connect 函数返回一个链接对象 和一个错误 对象,如果错误对象不为空,那就链接失败了. 然后我们可以再次测试,链接:client.Ping(context.TODO(), nil) cilent 对象 Ping 就好了,他会返回一个错误对象,如果不为空,就链接失败了

链接成功后,可以创建 数据表的 链接对象了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
collectionStudent := client.Database("mongodb_study").Collection("student")

mongodb_study 是数据库,student是数据表

断开链接对象 client.Disconnect()

如果我们不在使用 链接对象,那最好断开,减少资源消耗

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
err = client.Disconnect(context.TODO())
if err != nil {
    log.Fatal(err)
}
fmt.Println("Connection to MongoDB closed.")

操作数据库

CRUD操作

命令行输入mongo -u"xxx" -p"xxx" 进入mongodb

插入文档
插入单个文档

collection.InsertOne()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Student struct {
    Name string
    Age int
}
collectionStudent:= client.Database("mongodb_study").Collection("student")
stu1:=Student{"李四",133}
_,err = collectionStudent.InsertOne(context.TODO(),stu1)
if err != nil {
    log.Println(err)
}
插入多条文档

collection.InsertMany()

不同的是接受一个 切片作为数据集合:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Student struct {
    Name string
    Age int
}
students :=[]interface{}{Student{"张三",12},Student{"李四",123}}
_, err = collectionStudent.InsertMany(context.TODO(), students)
CheckErr(err)

命令行查看验证:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.student.find()
{ "_id" : ObjectId("62458616ef2590a98db33852"), "name" : "hyy", "age" : 19 }
{ "_id" : ObjectId("62458928ea5a619827084efc"), "name" : "hyy", "age" : 19 }
{ "_id" : ObjectId("62458b503e218bd570a37fc8"), "name" : "hhh", "age" : 13 }
{ "_id" : ObjectId("62458e840ad555317b9a3917"), "name" : "张三", "age" : 12 }
{ "_id" : ObjectId("62458e840ad555317b9a3918"), "name" : "李四", "age" : 123 }
更新文档
更新单个文档

collection.UpdateOne()

如果有多个满足条件的,只更新第一条

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// filter: 包含查询操作符的文档,可以用来选择要查询的文档
// 查询到name=hyy的文档
filter := bson.D{{"name", "hyy"}}
// 修改name 为hhhh
update := bson.D{
    {"$set",bson.D{{"name", "hhhh"}}},
}
collectionStudent.UpdateOne(context.TODO(), filter, update)

命令行查看验证:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.student.find()
{ "_id" : ObjectId("62458616ef2590a98db33852"), "name" : "hyy-new", "age" : 23 }
{ "_id" : ObjectId("62458928ea5a619827084efc"), "name" : "hyy", "age" : 19 }
{ "_id" : ObjectId("62458b503e218bd570a37fc8"), "name" : "hhh", "age" : 13 }
{ "_id" : ObjectId("62458e840ad555317b9a3917"), "name" : "张三", "age" : 12 }
{ "_id" : ObjectId("62458e840ad555317b9a3918"), "name" : "李四" }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// update := bson.M{"$set": Student{Name: "hyy-new"}}  
// 不推荐直接用结构体,玩意结构体字段多了,初始化为零值。
// 因为可能会吧零值更新到数据库,而不是像 gorm 的updates 忽略零值
更新多个文档

collection.UpdateMany()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ "_id" : ObjectId("62458928ea5a619827084efc"), "name" : "hyy", "age" : 19 }
{ "_id" : ObjectId("6245a141b6731395285e0315"), "name" : "hyy", "age" : 22, "nike_name" : [ [ "1", "2" ] ] }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
collectionStudent:= client.Database("mongodb_study").Collection("student")
filter := bson.D{{"name", "hyy"}}
update := bson.D{{"$inc",
                  bson.D{
                      {"age", 1},
                  },
                 }}
_, err = collectionStudent.UpdateMany(context.TODO(), filter, update)
CheckErr(err)

命令行查询结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.student.find({"name":"hyy"})
{ "_id" : ObjectId("62458928ea5a619827084efc"), "name" : "hyy", "age" : 20 }
{ "_id" : ObjectId("6245a141b6731395285e0315"), "name" : "hyy", "age" : 23, "nike_name" : [ [ "1", "2" ] ] }
查找文档

需要一个filter文档, 以及一个指针在它里边保存结果的解码

查询单个文档:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
collection.FindOne()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Student struct {
    Name string
    Age  int
}
var s Student
filter:=bson.D{{"name","hyy"}}
err = collectionStudent.FindOne(context.TODO(), filter).Decode(&s)
CheckErr(err)
fmt.Println(s)

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{hyy 20}
查询多个文档:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
collection.Find()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ "_id" : ObjectId("62458928ea5a619827084efc"), "name" : "hyy", "age" : 20 }
{ "_id" : ObjectId("6245a141b6731395285e0315"), "name" : "hyy", "age" : 23, "nike_name" : [ [ "1", "2" ] ] }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Student struct {
    Name string
    Age  int
}
filter:=bson.D{{"name","hyy"}}
cursor, err := collectionStudent.Find(context.TODO(), filter)
CheckErr(err)
defer cursor.Close(context.TODO())
var students []Student
err = cursor.All(context.TODO(), &students)
CheckErr(err)
for _, student := range students {
    fmt.Println(student)
}

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{hyy 20}
{hyy 23}
删除文档
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
collection.DeleteOne() 
collection.DeleteMany()

如果bson.D{{ }}作为filter参数,这会匹配集合内所有的文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
filter:=bson.D{{"name","hyy"}}
_, err = collectionStudent.DeleteMany(context.TODO(), filter)
CheckErr(err)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
6000 多款 App,看我如何搞定她们并将其洗白白~
如果说 GitHub 是程序员的天堂,那么 酷安 则是手机 App 爱好者们(别称「搞机」爱好者)的天堂,相比于那些传统的手机应用下载市场,酷安有三点特别之处:
1480
2019/08/05
5640
6000 多款 App,看我如何搞定她们并将其洗白白~
分析了 7 万款 App,全是没想到
摘要:使用 Scrapy 爬取豌豆荚全网 70,000+ App,并进行探索性分析。
Python编程与实战
2019/12/04
7470
Python爬虫新手教程:Python分析了 7 万款 App,万万没想到
摘要:使用 Scrapy 爬取豌豆荚全网 70,000+ App,并进行探索性分析。
一墨编程学习
2019/08/06
1.3K0
Python爬虫新手教程:Python分析了 7 万款 App,万万没想到
Python爬虫入门教程 36-100 酷安网全站应用爬虫 scrapy
2018年就要结束了,还有4天,就要开始写2019年的教程了,没啥感动的,一年就这么过去了,今天要爬取一个网站叫做酷安,是一个应用商店,大家可以尝试从手机APP爬取,不过爬取APP的博客,我打算在50篇博客之后在写,所以现在就放一放啦~~~
梦想橡皮擦
2019/02/20
9460
Python爬虫入门教程 36-100 酷安网全站应用爬虫 scrapy
Python数据可视化:豆瓣电影TOP250
首先任意文件夹下命令行运行scrapy startproject doubanTop250,创建一个名为doubanTop250的文件夹。
小F
2020/10/09
1.8K0
Python数据可视化:豆瓣电影TOP250
python scrapy爬虫练习(1) 爬取豆瓣电影top250信息
文章目录 一、分析网页 目标URL:https://movie.douban.com/top250?start=0&filter= 每一页有25条电影信息,总共10页。检查网页可以发现,每条电影的详细
叶庭云
2020/09/17
5.1K0
python  scrapy爬虫练习(1)   爬取豆瓣电影top250信息
电影荒?看看豆瓣排行榜上有没有你想看的电影!
项目创建完成后可以看到在工程创建的位置有了douban文件夹,打开以后包含了上述的组件,可以使用spyder,pycharm等ide打开项目
老肥码码码
2020/01/17
8840
电影荒?看看豆瓣排行榜上有没有你想看的电影!
项目实战 | Python爬虫概述与实践(三)
《项目实战 | python爬虫及实践(一)》中介绍了网络爬虫的定义、分类和基本流程。
用户3946442
2022/04/11
5840
项目实战 | Python爬虫概述与实践(三)
Scrapy(Python)爬虫框架案例实战教程,Mysql存储数据
任务:爬取腾讯网中关于指定条件的所有社会招聘信息,搜索条件为北京地区,Python关键字的就业岗位,并将信息存储到MySql数据库中。
程序猿的栖息地
2022/04/29
1K0
Scrapy项目实战:爬取某社区用户详情
get_cookies.py from selenium import webdriver from pymongo import MongoClient from scrapy.crawler import overridden_settings # from segmentfault import settings import time import settings class GetCookies(object): def __init__(self): # 初始化组件
hankleo
2020/09/17
5810
python爬虫 scrapy爬虫框架的基本使用
在编写爬虫的时候,如果我们使用 requests、aiohttp 等库,需要从头至尾把爬虫完整地实现一遍,比如说异常处理、爬取调度等,如果写的多了,的确会比较麻烦。利用现有的爬虫框架,可以提高编写爬虫的效率,而说到 Python 的爬虫框架,Scrapy 当之无愧是最流行最强大的爬虫框架了。
叶庭云
2020/09/17
1.7K0
爬取豆瓣电影信息
昨天写了一个小爬虫,爬取了豆瓣上2017年中国大陆的电影信息,网址为豆瓣选影视,爬取了电影的名称、导演、编剧、主演、类型、上映时间、片长、评分和链接,并保存到MongoDB中。
py3study
2020/01/20
1.3K0
从原理到实战,一份详实的 Scrapy 爬虫教程
本文将从原理到实战带领大家入门另一个强大的框架 Scrapy。如果对Scrapy感兴趣的话,不妨跟随本文动手做一遍!
CDA数据分析师
2021/08/05
11.2K0
从原理到实战,一份详实的 Scrapy 爬虫教程
分布式爬虫搭建系列 之三---scrapy框架初用
其次,通过我们的神器PyCharm打开我们的项目--crawlquote(也可以将PyCharm打开我们使用虚拟环境创建的项目)
wfaceboss
2019/04/08
5980
分布式爬虫搭建系列 之三---scrapy框架初用
Python(十六)
接下来的几篇,我们将介绍一下最流行的爬虫框架 Scrapy。本篇,我们会介绍一下 Scrapy 的基本使用。
1ess
2021/11/01
3380
Python(十六)
Scrapy框架的使用之Scrapy入门
接下来介绍一个简单的项目,完成一遍Scrapy抓取流程。通过这个过程,我们可以对Scrapy的基本用法和原理有大体了解。 一、准备工作 本节要完成的任务如下。 创建一个Scrapy项目。 创建一个Spider来抓取站点和处理数据。 通过命令行将抓取的内容导出。 将抓取的内容保存的到MongoDB数据库。 二、准备工作 我们需要安装好Scrapy框架、MongoDB和PyMongo库。 三、创建项目 创建一个Scrapy项目,项目文件可以直接用scrapy命令生成,命令如下所示: scrapy st
崔庆才
2018/06/25
1.4K0
分析了 6000 款 App,竟有这么多佳软神器没用过
摘要:在《6000 多款 App,看我如何搞定她们并将其洗白白~》中我们详细地分享了有关Scrapy框架抓取App数据的流程,并对抓回来的数据作了进一步的清洗。在本次分享中,接着对抓取回来的数据进行探索性分析,让你知道目前App市场的状况。
1480
2019/08/05
7040
分析了 6000 款 App,竟有这么多佳软神器没用过
Python3爬虫学习.md
(1) urllib 简单的爬取指定网站 (2) Scrapy 爬虫框架 (3) BeautifulSoup 爬虫解析
全栈工程师修炼指南
2020/10/23
8430
Python3爬虫学习.md
Scrapy 爬虫框架入门案例详解
本文介绍了如何使用 Scrapy 框架爬取知乎用户详细信息并存储到 MongoDB 数据库的过程。通过分析网页结构,使用 Scrapy 框架和 XPath、CSS 选择器提取数据,并利用 Spider 的 Item 输出格式将数据保存至 MongoDB 数据库。
崔庆才
2017/04/25
4K0
实操 | 从0到1教你用Python来爬取整站天气网
Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。
润森
2019/09/17
7570
实操 | 从0到1教你用Python来爬取整站天气网
相关推荐
6000 多款 App,看我如何搞定她们并将其洗白白~
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档