看到 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)
14597 次点击
所在节点    Go 编程语言
99 条回复
wowbaby
2021-10-25 10:24:46 +08:00
我一般看到 .H .D .M 这的命名就没有了兴趣
keepeye
2021-10-25 10:32:22 +08:00
这是什么操作,mongodb 写的库垃圾,让 go 背锅?让一个静态语言跟脚本语言去比较所谓的 “优雅”也是醉了
xz410236056
2021-10-25 10:49:33 +08:00
“嗯,静态语言应该都是要先定义模型,太不灵活了。”

针对这句话问一下,动态语言不定义模型,后面接手的人知道你这个字典里有什么值吗?能直接点属性用吗?还是要写一堆字符串去取,万一再拼错了
shockerli
2021-10-25 11:55:38 +08:00
我用过,MongoDB 官方的 Go SDK 确实拉胯,但这不能算到 Go 语言身上
ila
2021-10-25 12:10:10 +08:00
@lancelock 用 go 的,开发快,编译快,单文件运行。
需要这些的自然接受的了 go
ila
2021-10-25 12:11:03 +08:00
@xz410236056 由得他去吹。
python 一样要定义模型再 crud.
balabalaguguji
2021-10-25 12:42:05 +08:00
@shockerli #64 那能找到一个更优雅的库?
chtcrack
2021-10-25 12:45:36 +08:00
真的要性能不如用 c 或者 c++,感觉用 go 怪怪的.https://docs.mongodb.com/drivers/cxx/
c88155745
2021-10-25 13:47:13 +08:00
MongoDB 有 go struct 约束 还是可以用的 ,反而弱类型语言容易类型出错 不同人整出各种类型
cyrivlclth
2021-10-25 13:47:25 +08:00
可以用 entgo 写一套模板,生成操作 MongoDB 库的代码。。。我之前刚准备弄这个,但是忙忘了
thevita
2021-10-25 13:48:31 +08:00
1. 如果觉得用 js python 直接读更舒服完全可以用 js.
2. 没受过动态类型荼毒的,必然难以理解强类型系统的作用
3. 强类型与否, 看自己的 use case 吧这个不好说,有的场景就是用 js 写着就很爽,矫枉过正还是不好,被毒打多了就逐渐知道怎么平衡了
4. mongo 本来就是个文档数据库,半结构化,天然跟 js ,python 之类的会亲和一点
5. 应该能通过合理的约定+时代的封装 /抽象 来缓解,就是谨慎点用 mongo ,模式管理更规范一点(当然,并不是说你不规范的意思,只是说到这里了)
6. 写 go 踩到自己的地方多了去了,老想给自己一拳。
thevita
2021-10-25 13:53:43 +08:00
@thevita 对于我来说,这些硬编码的 "name", "age" 都是不能忍的,不过这就有点矫枉过正了
XTTX
2021-10-25 14:36:48 +08:00
从 mongoDB 和 Go 的不匹配到讨伐 Golang ,这出戏我见过了。每个语言都有自己存在的理由。用不用得习惯,适不适合自己的使用场景,得看自己。js 为了类型检查,搞出了 typescript. 都用习惯了就好了,没有完美的语言和工具
thtznet
2021-10-25 14:40:04 +08:00
C# 欢迎你,不极端,兼容各类语言的优点,集大成者。
lancelock
2021-10-25 14:42:21 +08:00
@ila go 开发快?讲笑话吗?唯一的优势就是编译了。不过其他技术栈上个 cicd 也就操心一次,后续也都一样了
skiy
2021-10-25 15:09:28 +08:00
可以等等试试泛型出来之后?
holulu
2021-10-25 15:20:42 +08:00
@x940727 祝您早日摆脱生态束缚,实现语言自由,成为想换就换的超级大神。:)
zhuangzhuang1988
2021-10-25 15:22:55 +08:00
@thtznet 能听就好了
x940727
2021-10-25 15:41:31 +08:00
@holulu 如果写小工具的话,那无所谓生态问题,毕竟现在大部分语言的标准库都不差,我平时也会用 Python 和 Go 写一些数据处理、系统小脚本之类的,但是如果是写复杂点的项目,生态的重要性就凸显出来了。
zjyl1994
2021-10-25 15:42:56 +08:00
我也觉得交互很傻,所以我放弃了 mongo 。个人觉得 mongo 没香到哪里去

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

https://tanronggui.xyz/t/810126

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

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

© 2021 V2EX