mongodb - Bson接口(interface)有一些问题

标签 mongodb go bson mgo

我使用带有 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/

相关文章:

http - 在包级别声明互斥变量是一种好习惯吗?

delphi - Delphi 的 Bson 库?

c# - 为所有继承自基类型的类设置自定义 MongoDB BsonSerializer

bash - 询问 MongoDB 是否是 bash 脚本中的 Master

python - PyMongo:JSON 键在 mongo 中得到更新

go - CoInitializeEx(COINIT_MULTITHREADED) 和使用 WMI 的协程

go - 包含需要清理的对象的包

mongodb - mongo-c-driver 找不到 libbson

node.js - NodeJS MongoDB : Querying ISO Date

validation - 使用 Backbone.js 验证时如何处理异步调用(特别是唯一性)