gpt4 book ai didi

mongodb - 使用 mgo 强制执行类型映射

转载 作者:IT王子 更新时间:2023-10-29 01:26:38 26 4
gpt4 key购买 nike

当 _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。但结果是 string 被选中了:

Mongo 外壳:

> 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 吗?

最佳答案

使用 SetterGetter用于控制 mongo 中表示的接口(interface):

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
}

关于mongodb - 使用 mgo 强制执行类型映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41595577/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com