gpt4 book ai didi

mongodb - 使用 mongodb-go-driver 编码/取消编码自定义类型

转载 作者:可可西里 更新时间:2023-11-01 10:45:16 25 4
gpt4 key购买 nike

所以我正在尝试官方的 mongodb go 驱动程序(之前使用的是 mgo),但我被卡住了。我正在尝试编码/取消编码自定义类型,这显然默认情况下不起作用。文档有点缺乏。基本上我想做的是:

type X struct {
Y Z
}


type Z interface {
...
}

有没有办法做到这一点,还是目前完全没有这个功能?我知道它仍然是测试版,但没有太多选择。

编辑:

例如我想做什么:

cur, err := mongo.Collection("coll").Find(ctx, bson.M{})
if err != nil {
return err
}
defer cur.Close(ctx)
for cur.Next(ctx) {
var el X
err := cur.Decode(&el)
if err == nil {
// Do whatever...
}
}
if err = cur.Err(); err != nil {
return err
}

我得到的错误是:找不到 Z 的解码器

测试示例:

package examples

import (
"context"
"testing"

"github.com/mongodb/mongo-go-driver/bson"
"github.com/mongodb/mongo-go-driver/mongo"
)

type X struct {
Color string `json:"color" bson:"color"`
Y Z `bson:"y"`
}

type Z interface {
echo() string
}

func (x X) echo() string {
return x.Color
}

func TestFindCars(t *testing.T) {
var err error
var client *mongo.Client
var collection *mongo.Collection
var cur mongo.Cursor
var ctx = context.Background()
if client, err = mongo.Connect(ctx, "mongodb://localhost/so?replicaSet=replset"); err != nil {
t.Fatal(err)
}
collection = client.Database("so").Collection(collectionName)
collection.InsertOne(ctx, bson.M{"color": "Red", "y": 12})
if cur, err = collection.Find(ctx, bson.M{}); err != nil {
t.Fatal(err)
}
if err != nil {
t.Fatal(err)
}
defer cur.Close(ctx)
for cur.Next(ctx) {
var el X
if err = cur.Decode(&el); err != nil {
t.Fatal(err)
}
t.Log(el.echo())
}
if err = cur.Err(); err != nil {
t.Fatal(err)
}
}

最佳答案

这是一个使用您的示例的完整示例,它运行良好。

package examples

import (
"context"
"testing"

"github.com/mongodb/mongo-go-driver/bson"
"github.com/mongodb/mongo-go-driver/mongo"
)

type X struct {
Color string `json:"color" bson:"color"`
Y Z
}

type Z interface {
echo() string
}

func (x X) echo() string {
return x.Color
}

func TestFindCars(t *testing.T) {
var err error
var client *mongo.Client
var collection *mongo.Collection
var cur mongo.Cursor
var ctx = context.Background()
if client, err = mongo.Connect(ctx, "mongodb://localhost/so?replicaSet=replset"); err != nil {
t.Fatal(err)
}
collection = client.Database("so").Collection(collectionName)
collection.InsertOne(ctx, bson.M{"color": "Red"})
if cur, err = collection.Find(ctx, bson.M{}); err != nil {
t.Fatal(err)
}
if err != nil {
t.Fatal(err)
}
defer cur.Close(ctx)
for cur.Next(ctx) {
var el X
if err = cur.Decode(&el); err != nil {
t.Fatal(err)
}
t.Log(el.echo())
}
if err = cur.Err(); err != nil {
t.Fatal(err)
}
}

测试

$ GOCACHE=off go test -v -run TestFindCars
=== RUN TestFindCars
--- PASS: TestFindCars (0.09s)
find2_test.go:49: Red
PASS

关于mongodb - 使用 mongodb-go-driver 编码/取消编码自定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54374229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com