Bson 接口存在一些问题



I uesd MongoDB v3.6.4 with mgo(gopkg.in/mgo.v2( 包

布森

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 但不同的参数类型得到不同的结果

为什么?

你在 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

最新更新