У интерфейса mongoDB Golang Bson есть некоторые проблемы?

Я использую MongoDB v3.6.4 с пакетом mgo(gopkg.in/mgo.v2)

BSON

var id interface{}  
id = 249678041972736  
bson.M{"_id": id}  
var id int64  
id = 249678041972736  
bson.M{"_id": id}

Буксировка бсон не такая же?
например:

func GetUser(id interface{}) (*User, error) {  
    session := MongoDB()  
    defer session.Close()  
    var m *User  
    err := session.DB.C("user").Find(&bson.M{"_id": id}).One(&m)  
    // !!!err: not found  
    if err != nil {  
        return nil, err  
    } else {  
        return m, nil  
    }
}  

но:

func GetUser(id int64) (*User, error) {  
    session := MongoDB()  
    defer session.Close()  
    var m *User  
    err := session.DB.C("user").Find(&bson.M{"_id": id}).One(&m)  
    // !!! err == nil 
    if err != nil {  
        return nil, err  
    } else {  
        return m, nil  
    }
}  

GetUser(id interface{}) can get err (not found)  
GetUser(id int64) can get nil err 

Обратите внимание на ошибку

Я использовал функцию GetUser и импортировал одно и то же значение 249678041972736, но другой тип параметра получил другой результат

Зачем???

1 ответ

Вы ставите ненужное & перед bson.M{…

err := session.DB.C("user").Find(bson.M{"_id": id}).One(&m)

Использование bson.M в поиске также не нужно, mgo имеет вызов FindId специально для поиска, который вы выполняете.

err := session.DB.C("user").FindId(id).One(&m)

gopkg.in/mgo.v2 теперь помечен как необслуживаемый. github.com/globalsign/mgo и github.com/globalsign/mgo/bson - это две поддерживаемые разветвленные библиотеки. Я не нашел проблем с их использованием вместо pf gopkg.in

Другие вопросы по тегам