看到 Go 与 MongoDB 的交互方式,我想放弃 Go 了

2021-10-24 11:48:43 +08:00
 balabalaguguji

之前习惯了 python/js 这种语法,感觉很自然很方便。

今天看了下 MongoDB 官方的 Go 接口,哎呀,那交互方式,真的是痛苦。

例如查询用户为 1 的用户:{userid: 1},在 Go 里面你还得包裹为 bson.D{{"userid", 1}}

返回的结果是一个索引,要 Decode 下,Docode 还需要传递一个结构体过去。

还得传递一个 context (还没看为啥要这么做,其他语言不用)

感觉一点也不方便,代码很多不美观不优雅,习惯了 js/python 这种比较简单直观的语法,难以接受呀。

感觉 Google 最近出的东西,语法都那么特立独行的,还有一个是死亡嵌套 Flutter ,嵌套到怀疑人生。

官方教程: https://www.mongodb.com/blog/post/mongodb-go-driver-tutorial

filter := bson.D{{"name", "Ash"}}

update := bson.D{
    {"$inc", bson.D{
        {"age", 1},
    }},
}

updateResult, err := collection.UpdateOne(context.TODO(), filter, update)
if err != nil {
    log.Fatal(err)
}

fmt.Printf("Matched %v documents and updated %v documents.\n", updateResult.MatchedCount, updateResult.ModifiedCount)
14596 次点击
所在节点    Go 编程语言
99 条回复
balabalaguguji
2021-10-24 21:02:00 +08:00
@learningman #27 所以人生短暂,准备用 nodejs 吧,写起来舒服。
balabalaguguji
2021-10-24 21:04:25 +08:00
@holulu #28 嗯,强类型确实没啥办法,不过 Java 的比 Go 的好很多,应该是有泛型的原因?(没怎么用过 JAVA)。
balabalaguguji
2021-10-24 21:07:56 +08:00
@xnotepad #29 嗯,静态语言是得这样,不过 Java 的也舒服很多。
@gengchun #31 性能就必须是静态语言吗?这个不是很了解
balabalaguguji
2021-10-24 21:11:19 +08:00
@sunmoon1983 #36 看了下,也是一堆包裹
YUyu101
2021-10-24 21:20:04 +08:00
确实不舒服,工作写了半年 go ,从没在工作用过的 nodejs 用起来无比丝滑,真是由俭入奢易,要是有一门语言把两者的优点合起来就好了。
ob
2021-10-24 21:22:40 +08:00
@YUyu101 数据库改个字段名或增删个字段,涉及到的 json ,结构体处理,都要改好几遍。
zjsxwc
2021-10-24 22:24:15 +08:00
rust 有宏有泛型,比 go 好多了
https://github.com/mongodb/mongo-rust-driver#example-usage
XTTX
2021-10-24 23:39:31 +08:00
JS 写成 typescript ,要写各式各样的 type\interface\generics, 可不必 Go 写 struct 方便多少。
XTTX
2021-10-24 23:45:50 +08:00
不清楚为什么贴主一定要用 mongoDB 。Go 写 psql query 挺方便的,写多了都是 boilerplate, 改改就差不多了
gengchun
2021-10-25 06:55:27 +08:00
@balabalaguguji 认真说起来的话。据说,动态里好像 erlang, groovy 这些强类型性能还可以,不过我都没有用过。我用过的里面,性能可以的确实都是静态的。主要是第一句看 python/js ,这个加上 golang 默认讨论的就是动态 vs. 静态,没仔细想就发了。

你的问题本身确实是 golang 的类型系统问题,但是 json 的这个的处理麻烦。并不是简单的需要静态检查,或者类型强弱导致的。如果只是强类型的话,但是有语法糖的话,其实也不会导致这样写。

不过语言设计太高深,还是打住,不然没完没了了。

总结一下,Golang 出于某个我不知道的原因,就是要让语言的用户,自己在业务代码层面上实现 hash 字典的处理。这么多年了,我估计默认的语法或者内置库,是不会有更方便的实现了。这个地方用 golang 不是自己封装,就是指着 orm ,也没有别的办法了。
wellsc
2021-10-25 09:17:13 +08:00
@avastms #1 你在说什么。。
vipppppp
2021-10-25 09:23:21 +08:00
MongoDB 官方的 Go 接口 真的,一言难尽。。。
p1gd0g
2021-10-25 09:24:37 +08:00
传 context 很正常吧。现在不传,以后有一天要用到再换函数?
airplayxcom
2021-10-25 09:35:05 +08:00
动态语言害人不浅
lizuoqiang
2021-10-25 09:35:15 +08:00
go 的 orm 真的一言难尽
pkoukk
2021-10-25 09:55:02 +08:00
动态语言害人不浅+1
别用 mongo 了,性能太差了,pg 吧
x940727
2021-10-25 10:04:42 +08:00
@holulu 不敢苟同,语言确实是工具,但是决定一个语言生命力的,语法不是关键性因素,语言附带的生态才是关键性因素。如果你换一个语言,就等于生态全部都需要重新去了解熟悉,这个沉没成本远比你想的要高的多,基本上没有老手会选择放弃自己钻研五六年的语言去换一个全新的语言,最多换一个相关性比较高的语言。我认为张嘴语言就是工具可以随便换的,不是超级大神,就是菜鸟……
qW7bo2FbzbC0
2021-10-25 10:14:00 +08:00
@Kisesy #15 mongodb 静态类型驱动本身就很捉急,更别提那种复杂 aggregate 操作转述时多么费力了。应该也可以输入 json str 自动转成 query document 的
rayw0ng
2021-10-25 10:20:04 +08:00
@pengtdyd Rust 官方例子,读起来很容易啊
use mongodb::{
bson::doc,
sync::Client,
};
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
struct Book {
title: String,
author: String,
}
let client = Client::with_uri_str("mongodb://localhost:27017")?;
let database = client.database("mydb");
let collection = database.collection::<Book>("books");

let docs = vec![
Book {
title: "1984".to_string(),
author: "George Orwell".to_string(),
},
Book {
title: "Animal Farm".to_string(),
author: "George Orwell".to_string(),
},
Book {
title: "The Great Gatsby".to_string(),
author: "F. Scott Fitzgerald".to_string(),
},
];

// Insert some books into the "mydb.books" collection.
collection.insert_many(docs, None)?;

let cursor = collection.find(doc! { "author": "George Orwell" }, None)?;
for result in cursor {
println!("title: {}", result?.title);
}
lancelock
2021-10-25 10:22:42 +08:00
go 写业务本来就是残废。之前帮亲戚写了一个东西后就被我放弃了。但架不住跟风吹的多啊,中国人的权威崇拜深入骨髓,看着两个创世人的履历,和大公司的背景就不能自已了。凡是觉得不好用的,那一定是自己的问题,凡人不能领会大神的思维。动辄大道至简,你不懂 go 的哲学,可惜你的哲学也不是那么坚挺啊,这不就加上了泛型

关键 go 吹你吹就吹吧,还爱给你安利:来用 go 吧,你会打开新世界的大门。一副没有见识的样子,真实无语

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/810126

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX