web-dev-qa-db-ja.com

mongodb-go-driverで、BSONを構造体にマーシャリング/アンマーシャリングする方法

Mongodb-go-driverは初めてです。しかし、私は立ち往生しています。

cursor, e := collection.Find(context.Background(), bson.NewDocument(bson.EC.String("name", id)))

for cursor.Next(context.Background()) {

    e := bson.NewDocument()
    cursor.Decode(e)

    b, _ := e.MarshalBSON()
    err := bson.Unmarshal(b, m[id])
}

M [id]のコンテンツを見ると、コンテンツはありません-すべてnullです。

私の地図はこんな感じです:m map [string] Language

言語は次のように定義されます:

type Language struct {
    ID         string   `json:"id" bson:"_id"`                   // is this wrong?
    Name       string   `json:"name" bson:"name"`
    Vowels     []string `json:"vowels" bson:"vowels"`
    Consonants []string `json:"consonants" bson:"consonants"`
}

私は何を間違えていますか?

私はこの例を使用して学習しています: https://github.com/mongodb/mongo-go-driver/blob/master/examples/documentation_examples/examples.go

7
iam thadiyan

公式のMongoDBドライバーは、MongoDB ObjectIdにobjectid.ObjectIDタイプを使用します。このタイプは次のとおりです。

type ObjectID [12]byte

したがって、構造体を次のように変更する必要があります。

type Language struct {
    ID         objectid.ObjectID   `json:"id" bson:"_id"`             
    Name       string   `json:"name" bson:"name"`
    Vowels     []string `json:"vowels" bson:"vowels"`
    Consonants []string `json:"consonants" bson:"consonants"`
}

私は成功しました:

m := make(map[string]Language)
cursor, e := collection.Find(context.Background(), bson.NewDocument(bson.EC.String("name", id)))

for cursor.Next(context.Background()) {

    l := Language{}
    err := cursor.Decode(&l)
    if err != nil {
        //handle err
    }
    m[id] = l // you need to handle this in a for loop or something... I'm assuming there is only one result per id
}
8
Farhad Farahi

新しい「github.com/mongodb/mongo-go-driver」では、次のように定義されたオブジェクトIDが必要です。

type Application struct {
    ID      *primitive.ObjectID `json:"ID" bson:"_id,omitempty"`
}

これはJSON "ID":"5c362f3fa2533bad3b6cf6f0"そして、ここに挿入結果からIDを取得する方法があります

if oid, ok := res.InsertedID.(primitive.ObjectID); ok {
    app.ID = &oid
}

文字列から変換

appID := "5c362f3fa2533bad3b6cf6f0"    
id, err := primitive.ObjectIDFromHex(appID)
if err != nil {
    return err
}
_, err = collection.DeleteOne(nil, bson.M{"_id": id})

文字列に変換

str_id := objId.Hex()
11
Alexey Podlasov

更新:最近、新しい変更が行われましたが、次のように変更する必要があります。

import "github.com/mongodb/mongo-go-driver/bson/primitive"

type Language struct {
    ID         primitive.ObjectID `bson:"_id,omitempty"` // omitempty to protect against zeroed _id insertion         
    Name       string   `json:"name" bson:"name"`
    Vowels     []string `json:"vowels" bson:"vowels"`
    Consonants []string `json:"consonants" bson:"consonants"`
}

そして、ID値を取得します。

log.Println("lang id:", objLang.ID)
...
2
Illia Danko

私は得ていました

cannot decode objectID into an array

だから私は

ID interface{} `bson:"_id,omitempty"`

問題なく

1
Yianni