一尘不染

使用mgo强制进行类型映射

go

_id成员的类型仅从bson.ObjectId派生时,不再映射为ObjectId类型:

import (
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
)

type CustomId bson.ObjectId

type Foo struct {
    ID1    CustomId `bson:"_id"` // broken
    ID2    bson.ObjectId         // mapped as expected
}


func main() {
    session, _ := mgo.Dial("127.0.0.1")
    coll := session.DB("mgodemo").C("foocoll")

    doc := Foo{
        CustomId(bson.NewObjectId()),
        bson.NewObjectId(),
    }

    coll.Insert(doc)
}

id 在Mongo中应该是一个 _ObjectId 。但是事实证明,选择了 字符串

Mongo Shell:

> db.foocoll.findOne()
{ "_id" : "XvMn]K� �\f:�", "id2" : ObjectId("58764d6e5d4be120fa0c3ab1") }  // id2 is OK ...

> typeof db.foocoll.findOne()._id
string  // OOps. Should be ObjectId !

这可能是有意的,因为 bson.ObjectId 本身是从 string 派生的。但是在这里,这对我们不利。

我们可以告诉mgo将_id映射到数据库中的ObjectId吗?


阅读 187

收藏
2020-07-02

共1个答案

一尘不染

使用SetterGetter接口控制mongo中的表示形式:

type CustomId bson.ObjectId

func (id *CustomId) SetBSON(raw bson.Raw) error {
   var v bson.ObjectId
   err := raw.Unmarshal(&v)
   *id = CustomId(v)
   return err
}
func (id CustomId) GetBSON() (interface{}, error) {
   return bson.ObjectId(id), nil
}
2020-07-02