In mongodb-go-driver, how to marshal/unmarshal BSON in to a struct

后端 未结 4 853
野趣味
野趣味 2021-02-05 21:19

I am new to mongodb-go-driver. But i am stuck.

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

for cursor.Nex         


        
相关标签:
4条回答
  • 2021-02-05 22:04

    Newer "github.com/mongodb/mongo-go-driver" expects object IDs defined as

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

    This serializes into JSON "ID":"5c362f3fa2533bad3b6cf6f0" and here is how you get the ID from insert result

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

    Convert from string

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

    Convert into string

    str_id := objId.Hex()
    
    0 讨论(0)
  • 2021-02-05 22:14

    Update: New changes were made recently, now have to change to:

    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"`
    }
    

    And take the ID value:

    log.Println("lang id:", objLang.ID)
    ...
    
    0 讨论(0)
  • 2021-02-05 22:18

    I was getting

    cannot decode objectID into an array

    so i changed to

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

    without any issues

    0 讨论(0)
  • 2021-02-05 22:21

    The official MongoDB driver uses the objectid.ObjectID type for MongoDB ObjectIds. This type is:

    type ObjectID [12]byte

    So you need to change your struct to:

    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"`
    }
    

    I had success with:

    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
    }
    
    0 讨论(0)
提交回复
热议问题