首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用mgo强制类型映射

使用mgo强制类型映射
EN

Stack Overflow用户
提问于 2017-01-11 16:11:01
回答 2查看 642关注 0票数 2

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

代码语言:javascript
复制
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应该是蒙古族的ObjectId。但事实证明,绳子是被选中的:

蒙戈壳牌:

代码语言:javascript
复制
> 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本身是从字符串派生的。但在这里,这对我们不利。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-11 17:00:02

使用塞特吸气剂接口控制mongo中的表示:

代码语言:javascript
复制
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
}
票数 3
EN

Stack Overflow用户

发布于 2017-01-11 16:41:39

当你这样做时:

代码语言:javascript
复制
type CustomId bson.ObjectId

您正在创建一个新类型,mgo包将不再将其视为/识别为bson.ObjectId ( bson包中的bson.ObjectId类型是“硬编码”)。新类型将有0种方法。

我只想坚持bson.ObjectId。但是,如果仍然希望使用自定义ID类型,则可以在创建CustomId时使用嵌入:嵌入类型为bson.ObjectId的值,并为ID1字段使用inline bson标志:

代码语言:javascript
复制
type CustomId struct {
    bson.ObjectId `bson:"_id"`
}

type Foo struct {
    ID1 CustomId      `bson:",inline"`
    ID2 bson.ObjectId 
}

使用它:

代码语言:javascript
复制
doc := Foo{
    CustomId{bson.NewObjectId()},
    bson.NewObjectId(),
}

这具有CustomId拥有bson.ObjectId所拥有的所有方法的优点,您可以添加新的方法并“覆盖”现有的方法。

另一种选择是为您的interface{}使用接口类型(例如,CustomId ),使用它要“简单得多”:

代码语言:javascript
复制
type CustomId interface{}

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

使用它:

代码语言:javascript
复制
doc := Foo{
    bson.NewObjectId(),
    bson.NewObjectId(),
}

当然,沿着这条路走下去,如果您需要访问包装好的类型断言bson.ObjectId,就必须使用CustomId

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41595577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档