Golang实现MongoDB增删改查(CRUD)应用遇到问题求帮助
Golang实现MongoDB增删改查(CRUD)应用遇到问题求帮助 我正在开发一个简单的CRUD应用程序,使用的数据库是MongoDB。在使用collection.FindOne从集合中提取文档时遇到了一个问题。我无法获取以"ID"结尾的两个字段(即orderID和itemID)的实际值。这些字段存储的是简单的整数值,如1、2、3、4等。每次使用FindOne时,虽然能获取到正确的文档,所有其他字段的值都正确,但orderID和itemID却总是显示为0。请问有人能帮我解决这个问题吗?谢谢。
嗯,这确实很奇怪。那么存储的文档中是正确的对吧?只是在读取时不起作用?
编辑:你能提供一下用来读取文档的代码示例吗?
更多关于Golang实现MongoDB增删改查(CRUD)应用遇到问题求帮助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这完全是个瞎猜的尝试,但试试把 bson.M{} 改成 bson.D{{}},看看结果是否相同?
这个说法不正确,请参考下一条评论。
现在我已经得到了正确的结果,感谢。bson.M{} 工作正常。但我注意到任何以 “id” 或 “ID” 结尾的字段名都无法被读取。例如:pid 可以正确读取,但 pID 却不行。是不是有一些我遗漏的规则?
func main() {
fmt.Println("hello world")
}
感谢您的快速回复。但我一直在按照相同的适配器和教程操作,但没有任何方法能解决这个问题。即使使用 bson/primitive 传递正确的类型,问题仍然存在。甚至读取 ObjectID 返回的是 ObjectID(“0000000…”),而不是在 MongoDB Compass 中看到的字母数字字符串。有点奇怪。
// 代码示例
func main() {
// 此处为示例代码
}
1 个赞
你好 Arnav,
虽然我有一段时间没使用MongoDB了,但如果没记错的话,你需要使用名为 bson 的组件。
它包含在Go MongoDB驱动程序中。
mongodb/mongo-go-driver
MongoDB的Go语言驱动程序。通过在GitHub上创建账户为mongodb/mongo-go-driver开发做贡献。
或者,它也可以作为独立包使用。
Package bson
bson包是Go语言BSON规范的实现:
MongoDB官网上有一个非常棒的教程,专门讲解如何在Go中使用MongoDB和BSON。

MongoDB Go驱动教程 | MongoDB博客
MongoDB近期发布了Go语言的官方驱动。学习如何在Go中安装MongoDB并执行CRUD操作。
希望这些信息对你有帮助
数据库中的实际数据是正确的,但我在结果中获取到的却是"全零值"。
package main
import (
"context"
"fmt"
"log"
"net/http"
"github.com/gorilla/mux"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
type Person struct {
ID primitive.ObjectID
Name string
Age int
}
func main() {
// 路由器设置
r := mux.NewRouter()
// MongoDB初始化
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
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")
collection := client.Database("people").Collection("general")
r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
var result Person
err := collection.FindOne(context.TODO(), bson.M{}).Decode(&result)
if err != nil {
log.Fatal(err)
}
// json.NewEncoder(w).Encode(result)
fmt.Println(result)
}).Methods("GET")
http.ListenAndServe("0.0.0.0:8888", r)
}
输出: {ObjectID("000000000000000000000000") Arnav 24}
实际ObjectID: "5d26190f6f297fc7ef229ea3"
问题很可能是由于结构体字段标签定义不正确导致的。MongoDB默认使用_id作为主键字段,而Go结构体需要使用bson标签来正确映射字段名。
以下是解决方案和示例代码:
package main
import (
"context"
"fmt"
"log"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
// 正确的结构体定义
type Order struct {
ID primitive.ObjectID `bson:"_id,omitempty"`
OrderID int `bson:"orderID"` // 注意这里的bson标签
ItemID int `bson:"itemID"` // 注意这里的bson标签
Name string `bson:"name"`
Price float64 `bson:"price"`
}
func main() {
// 连接MongoDB
client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017"))
if err != nil {
log.Fatal(err)
}
defer client.Disconnect(context.TODO())
collection := client.Database("test").Collection("orders")
// 查询示例
var result Order
err = collection.FindOne(context.TODO(), bson.M{"name": "example"}).Decode(&result)
if err != nil {
log.Fatal(err)
}
fmt.Printf("OrderID: %d, ItemID: %d\n", result.OrderID, result.ItemID)
}
如果你的结构体定义是这样的错误示例:
// 错误的定义 - 缺少bson标签
type Order struct {
ID primitive.ObjectID
OrderID int // 没有bson标签,默认映射为小写orderid
ItemID int // 没有bson标签,默认映射为小写itemid
Name string `bson:"name"`
Price float64 `bson:"price"`
}
MongoDB中的字段名是orderID和itemID(注意大小写),但Go结构体默认会映射为小写字段名orderid和itemid,导致无法正确匹配。
确保:
- 结构体字段使用正确的
bson标签 - 标签中的字段名与MongoDB中存储的字段名完全一致(包括大小写)
- 如果MongoDB中的字段名是
orderid和itemid(全小写),那么bson标签也应该是小写
检查你的MongoDB文档实际存储的字段名,然后相应调整结构体的bson标签即可解决问题。

