bson.ObjectId

时间:2018-12-16 00:24:50

标签: mongodb go bson objectid

当我遇到以下情况时,我正在创建一元测试:

  • 我有一个带有外键的对象。出于某种原因,我需要切换ID并可以使用。但是,有时我需要删除此ID。如果我有一个ID,我会意识到某个动作,如果没有,则什么也不会发生。

但是,我找不到将bson.ObjectId设置为nil或设置为零的方法。

有人知道该怎么做或可以解决吗?

3 个答案:

答案 0 :(得分:2)

bson.ObjectId是string的别名,因此零值是空字符串“”

答案 1 :(得分:1)

基于@dom答案(在评论中),有一种我现在正在使用的解决方法:

package your_package

import "github.com/globalsign/mgo/bson"

func GenerateNewGuidHelper() *bson.ObjectId {
    id := bson.NewObjectId()
    return &id
}

func IsStringIdValid(id string) bool {
    return id != "" && bson.IsObjectIdHex(id)
}

func ConvertStringIdToObjectId(id string) *bson.ObjectId {
    if id != "" && bson.IsObjectIdHex(id){
        bsonObjectId := bson.ObjectIdHex(id)
        return &bsonObjectId
    }
    return nil
}

func ConvertStringIdsToObjectIds(ids []string) []*bson.ObjectId {
    var _ids []*bson.ObjectId
    for _, id := range ids {
        _ids = append(_ids, ConvertStringIdToObjectId(id))
    }
    return _ids
}

func IsObjectIdValid(id *bson.ObjectId) bool {
    return id.Hex() != "" && bson.IsObjectIdHex(id.Hex())
}

func ConvertObjectIdToStringId(id *bson.ObjectId) string  {
    if id != nil {
        return id.Hex()
    }
    return ""
}

func ConvertObjectIdsToStringIds(ids []*bson.ObjectId) []string {
    var _ids []string
    for _, id := range ids {
        _ids = append(_ids, ConvertObjectIdToStringId(id))
    }
    return _ids
}

此外,如@dom所述,我现在将mongoDB ID保存为*bson.ObjectId而不是bson.ObjectId。示例:

package datamodels

import (
    "github.com/globalsign/mgo/bson"
)

type User struct {
    ID *bson.ObjectId `protobuf:"bytes,1,opt,name=id,proto3" json:"_id,omitempty" bson:"_id,omitempty"`
}

希望对您有帮助!

答案 2 :(得分:0)

或者您可以使用primitive.NilObjectID

  

NilObjectID是ObjectID的零值。