Golang中如何读取MongoDB数据
Golang中如何读取MongoDB数据 我正在尝试从MongoDB中读取数据,以下是我当前的代码:
import (
"context"
"fmt"
"github.com/mongodb/mongo-go-driver/mongo"
"log"
)
// Size定义了项目尺寸
type Size struct {
H int
W float64
Uom string
}
// Item定义了一个项目
type Item struct {
Item string
Qty int
Tags []string
Size Size
}
func main() {
// 连接到MongoDB
client, err := mongo.Connect(context.Background(), "mongodb://localhost:27017", nil)
if err != nil {
log.Fatal(err)
}
db := client.Database("bigbackup")
inventory := db.Collection("info_consumer_base_mongos")
cur, err := inventory.Find(context.Background(), nil)
if err != nil { log.Fatal(err) }
defer cur.Close(context.Background())
for cur.Next(context.Background()) {
raw, err := cur.DecodeBytes()
if err != nil { log.Fatal(err) }
fmt.Printf("itemRead = %v\n", raw)
// 对元素进行处理...
}
if err := cur.Err(); err != nil {
return
}
}`
如何选择每个结果或循环处理原始数据,以便将字段保存到字符串中,像这样?
raw[1] 或 raw[“FN”]

更多关于Golang中如何读取MongoDB数据的实战教程也可以访问 https://www.itying.com/category-94-b0.html
4 回复
如果没有更多详细信息(如完整代码),很难准确回答您的问题。例如,bson2 的类型是什么?原始数据是什么?我认为您可以先尝试一个示例,将其反序列化以获取对象 ID。如果您能提供我之前提到的示例原始数据和 bson2,我将更容易理解问题所在。
更多关于Golang中如何读取MongoDB数据的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
如果你了解原始数据的完整结构,可以为数据项定义结构体并通过json进行反序列化。否则,可以尝试将其反序列化为 map[string]interface{},并通过 data["FN"] 进行访问,这里有一个简单示例:
package main
import (
"encoding/json"
"fmt"
)
func main() {
data := `{"FN":"Alice","LN":"Green"}`
var m map[string]interface{}
json.Unmarshal([]byte(data), &m)
fmt.Println(m["FN"])
}
好的,我需要找到一种将 _id 转换为字符串的方法,这是我目前的代码。但对我来说不起作用。
defer cur.Close(context.Background())
for cur.Next(context.Background()) {
raw, err := cur.DecodeBytes()
var ob map[string]interface{}
_ = bson.Unmarshal(raw, &ob)
id := bson2.ObjectId(&ob["_id"])
fmt.Println(id.Hex())
if err != nil { log.Fatal(err) }
break
// do something with elem....
}

在Golang中读取MongoDB数据时,您可以使用结构体解码来直接访问字段,而不是处理原始字节。以下是修改后的代码示例:
import (
"context"
"fmt"
"log"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
// Size定义了项目尺寸
type Size struct {
H int `bson:"h"`
W float64 `bson:"w"`
Uom string `bson:"uom"`
}
// Item定义了一个项目
type Item struct {
Item string `bson:"item"`
Qty int `bson:"qty"`
Tags []string `bson:"tags"`
Size Size `bson:"size"`
}
func main() {
// 连接到MongoDB
client, err := mongo.Connect(context.Background(), options.Client().ApplyURI("mongodb://localhost:27017"))
if err != nil {
log.Fatal(err)
}
defer client.Disconnect(context.Background())
db := client.Database("bigbackup")
inventory := db.Collection("info_consumer_base_mongos")
cur, err := inventory.Find(context.Background(), bson.D{})
if err != nil {
log.Fatal(err)
}
defer cur.Close(context.Background())
for cur.Next(context.Background()) {
var item Item
err := cur.Decode(&item)
if err != nil {
log.Fatal(err)
}
// 直接访问字段
fmt.Printf("Item: %s\n", item.Item)
fmt.Printf("Quantity: %d\n", item.Qty)
fmt.Printf("Tags: %v\n", item.Tags)
fmt.Printf("Size - H: %d, W: %.2f, Uom: %s\n", item.Size.H, item.Size.W, item.Size.Uom)
// 将字段保存到字符串
itemStr := fmt.Sprintf("Item: %s, Qty: %d", item.Item, item.Qty)
fmt.Println(itemStr)
}
if err := cur.Err(); err != nil {
log.Fatal(err)
}
}
如果您需要动态访问字段,可以使用bson.M:
for cur.Next(context.Background()) {
var result bson.M
err := cur.Decode(&result)
if err != nil {
log.Fatal(err)
}
// 按字段名访问
if item, ok := result["item"]; ok {
fmt.Printf("Item: %v\n", item)
}
if qty, ok := result["qty"]; ok {
fmt.Printf("Quantity: %v\n", qty)
}
// 将特定字段保存为字符串
itemStr := fmt.Sprintf("%v", result["item"])
fmt.Printf("Item as string: %s\n", itemStr)
}
对于嵌套字段访问:
for cur.Next(context.Background()) {
var result bson.M
err := cur.Decode(&result)
if err != nil {
log.Fatal(err)
}
// 访问嵌套字段
if size, ok := result["size"].(bson.M); ok {
if h, ok := size["h"].(int32); ok {
fmt.Printf("Size H: %d\n", h)
}
if w, ok := size["w"].(float64); ok {
fmt.Printf("Size W: %.2f\n", w)
}
}
}

