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”]

mongo


更多关于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....

}

48259060_922644911263606_1192657987978657792_n

在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)
        }
    }
}
回到顶部