我使用带有 mgo(gopkg.in/mgo.v2) 包的 MongoDB v3.6.4
贝森
var id interface{}
id = 249678041972736
bson.M{"_id": id}
var id int64
id = 249678041972736
bson.M{"_id": id}
两个bson不一样?
例如:
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 但是不同的参数类型得到不同的结果
为什么?
最佳答案
你在 bson 前面放了一个不必要的 & 。M{...
err := session.DB.C("user").Find(bson.M{"_id": id}).One(&m)
在find中使用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 是两个维护的 fork 库。我发现使用它们没有问题 pf gopkg.in
关于mongodb - Bson接口(interface)有一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50248471/