在golang中无法通过ObjectId获取mongodb记录

Posted

技术标签:

【中文标题】在golang中无法通过ObjectId获取mongodb记录【英文标题】:Can't get mongodb record by ObjectId in golang 【发布时间】:2018-05-22 14:27:09 【问题描述】:

我正在尝试使用以下代码通过 ObjectId 获取 mongodb 记录,但通过 err.Error()

不断得到 not found

以下是我的 mongo 集合示例

 "_id" : ObjectId("5a2a75f777e864d018131a59"), "callDate" : "22/12/2017", "time" : "16.25", "callType" : "a", "position" : "aaa", "description" : "aaaaaa", "qty" : 2, "estimatedDuration" : 2.3, "estimatedOvertime" : 3.44, "rate" : 4, "laborExtension" : 3 
 "_id" : ObjectId("5a2a75f877e864d018131a5b"), "callDate" : "22/12/2017", "time" : "16.25", "callType" : "a", "position" : "aaa", "description" : "aaaaaa", "qty" : 2, "estimatedDuration" : 2.3, "estimatedOvertime" : 3.44, "rate" : 4, "laborExtension" : 3 
 "_id" : ObjectId("5a2a75fa77e864d018131a5d"), "callDate" : "22/12/2017", "time" : "16.25", "callType" : "a", "position" : "aaa", "description" : "aaaaaa", "qty" : 2, "estimatedDuration" : 2.3, "estimatedOvertime" : 3.44, "rate" : 4, "laborExtension" : 3 

以下是我的模型

type RhinoJobs struct  
ID                bson.ObjectId  `db:"id" json:"id" bson:"_id"` 
CallDate          string  `db:"call_date" json:"callDate" bson:"callDate"` 
Time              string  `db:"time" json:"time" bson:"time"` 
CallType          string  `db:"call_type" json:"callType" bson:"callType"` 
Position          string  `db:"position" json:"position" bson:"position"` 
Description       string  `db:"description" json:"description" bson:"description"` 
Qty               int     `db:"qty" json:"qty" bson:"qty"` 
EstimatedDuration float64 `db:"estimated_duration" json:"estimatedDuration" bson:"estimatedDuration"` 
EstimatedOvertime float64 `db:"estimated_overtime" json:"estimatedOvertime" bson:"estimatedOvertime"` 
Rate              float64 `db:"rate" json:"rate" bson:"rate"` 
LaborExtension    float64 `db:"labor_extension" json:"laborExtension" bson:"laborExtension"` 
 

我想通过对象 id 搜索这些记录

"gopkg.in/mgo.v2"

func GetMongoSession() (*mgo.Session, error) 
    if mgoSession == nil 
        var err error
        mgoSession, err = mgo.Dial(mongoConnectionUrl)
        if err != nil 
            return nil, err
        
    
    return mgoSession.Clone(), nil




func GetJobByID(objID string) (models.RhinoJobs, error) 
    var job models.RhinoJobs
    s, err := commons.GetMongoSession()
    if err != nil 
        errMsg := "error occurred while creating mongoDB connection stack:" + err.Error()
        print(err.Error())
        return job, errors.New(errMsg)
    
    defer s.Close()
    err = s.DB("rhino").C("jobs").FindId(bson.ObjectIdHex("5a2a75f777e864d018131a59")).One(&job)
    if err != nil 
        print(err.Error())
        errMsg := "error occurred while getting data :" + err.Error()
        return job, errors.New(errMsg)
    
    return job, nil

但是当我尝试通过以下代码获取所有收藏记录时,它工作正常

err := s.DB("rhino").C("jobs").Find(nil).All(&jobs)

我还检查了以下 SO Q&A 但没有用

Querying mongodb from golang using the _id stored in an array

How to find by id in golang and mongodb

Cannot retrieve "_id" value using mgo with golang

【问题讨论】:

你使用什么库与MongoDB进行交互? @V.Panchenko "gopkg.in/mgo.v2/bson" 请澄清您的代码,让我们知道s 对象是什么(使用方法DB("xxxxx") 以及可以在什么包中找到它 好的,common 是什么?)@Nisal,你应该提供最少的代码让我重复你的问题并尝试在我的机器上修复) 天哪,我遇到了同样奇怪的情况。 FindAll 工作正常,还按其他属性过滤,只是在 ObjectId 上失败... 【参考方案1】:

以上任何 cmets 或答案都无法解决问题,所以,我要做的是,

1) 将自定义生成的objectId添加到记录中。

    i := bson.NewObjectId()

    rhinoJobs.id = i

    err = coll.Insert(rhinoJobs)

2) 按该自定义 objectId 搜索

func GetJobByID(objID string) (models.RhinoJobs, error) 
    var job models.RhinoJobs
    s, err := commons.GetMongoSession()
    if err != nil 
        errMsg := "error occurred while creating mongoDB connection stack:" + err.Error()
        print(err.Error())
        return job, errors.New(errMsg)
    
    defer s.Close()
    err = s.DB("rhino").C("jobs").FindId(bson.ObjectIdHex(objID)).One(&job)
    if err != nil 
        print(err.Error())
        errMsg := "error occurred while getting data :" + err.Error()
        return job, errors.New(errMsg)
    
    return job, nil

认为这可能对将来的某人有所帮助。

有用的链接

Possibility of duplicate Mongo ObjectId's being generated in two different collections?

【讨论】:

【参考方案2】:

我遇到了完全相同的问题,我的问题是我最近切换到了新的 mgo fork(正在积极开发中)并且我混淆了依赖项。

我基本上将来自 globalsign 的 mgo 与来自 gopkg.in 的旧 bson 一起使用。请检查您的依赖关系!

"github.com/globalsign/mgo"
"gopkg.in/mgo.v2/bson"

这是错误的!

应该是:

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

【讨论】:

我在官方的 MongoDB mongo-driver 中遇到了一个非常相似的问题,并在 this tutorial 中找到了一些有用的说明和示例...参见 this question

以上是关于在golang中无法通过ObjectId获取mongodb记录的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Data MongoDB 通过 GridFS ObjectId 获取二进制流

从 GoLang 中的 mongodb 获取最后插入的元素

从 GoLang 中的 mongodb 获取最后插入的元素

golang:bson.ObjectId与string转化

如何通过它的 objectID 获取核心数据实体?

无法使用带有 golang 的 mgo 检索“_id”值