【问题标题】:What is the nil/zero value of bson.ObjectIdbson.ObjectId 的零/零值是多少
【发布时间】:2019-05-16 19:51:39
【问题描述】:

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

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

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

有谁知道怎么做或解决方法吗?

【问题讨论】:

  • 这就像 &string("Hello")。这是无效的。但是您可以将bson.ObjectIdHex(id) 值存储到某个tmp 变量中,然后将&tmp 分配给*bson.ObjectID 变量。
  • 也许有更好的方法来实现它,但我得看代码sn-p。

标签: mongodb go bson objectid


【解决方案1】:

或者您可以使用primitive.NilObjectID

NilObjectID 是 ObjectID 的零值。

【讨论】:

  • 我把答案从我的回复换成了你的,我觉得你的方法更符合逻辑:)
【解决方案2】:

bson.ObjectId 是 string 的别名,因此零值是一个空字符串 ""

【讨论】:

    【解决方案3】:

    基于@dom 答案(在 cmets 中),我现在正在使用解决方法:

    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"`
    }
    

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2014-05-27
      • 2021-04-14
      • 2020-08-06
      • 2021-12-30
      • 1970-01-01
      • 2021-05-02
      • 2013-05-17
      • 2015-04-30
      • 2018-02-14
      相关资源
      最近更新 更多