_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吗?
使用Setter和Getter接口控制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 }