У интерфейса 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