为了账号安全,请及时绑定邮箱和手机立即绑定

mgo.v2 Find().Select().One() 返回空白

mgo.v2 Find().Select().One() 返回空白

Go
胡子哥哥 2022-01-10 15:06:37
mongo shell 输出> db.departments.find(){ "_id" : ObjectId("5733b051e444917f9d273ce6"), "id" : "5733b05157659a11a4589102", "brandid" : "1", "name" : "first", "managerid" : "0", "users" : [ "1", "2", "3", "7" ] }该函数将 depID 作为输入,我验证了它应该是什么,即 5733b05157659a11a4589102func GetUsers(depID string) (*department.UsersResp, error) {    if !bson.IsObjectIdHex(depID) {        return nil, fmt.Errorf("%s is not a ObjectId value", depID)    }    type UserResp struct {        users []string     }    var result *UserResp    err := coll.Find(bson.M{"id": depID}).Select(bson.M{"users": 1}).One(&result)    if err != nil {    fmt.Println(err, result)        return nil, err    }    fmt.Println("result:",result)    //ignore return type and value the above print is what i have doubt about    return result, nil}结果的输出来了 {[]}我尝试了以下查询,其他err := coll.Find(bson.M{"id": depID})One(&result)err := coll.Find(nil).One(&result)结果相同。数据库连接和其他事情都很好,因为使用相同变量的同一文件的所有其他功能都coll有效更多信息 我也试过这个type UserResp struct {   users []string `json:"users" bson:"users"`}蒙哥日志MGO: cluster.go:590: Cluster has 1 known masters and 0 known slaves.MGO: socket.go:391: Socket 0xc8201340e0 to 127.0.0.1:27017: serializing op: &mgo.queryOp{collection:"departments.departments", query:bson.M{"id":"5733b05157659a11a4589102"}, skip:0, limit:-1, selector:bson.M{"users":1}, flags:0x4, replyFunc:(mgo.replyFunc)(0x58eef0), mode:1, options:mgo.queryWrapper{Query:interface {}(nil), OrderBy:interface {}(nil), Hint:interface {}(nil), Explain:false, Snapshot:false, ReadPreference:bson.D(nil), 
查看完整描述

3 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

我认为问题可能是您的 UserResp 结构具有私有成员。


//Instead of

 users []string `json:"users" bson:"users"`


// Try

 Users []string `json:"users" bson:"users"`


查看完整回答
反对 回复 2022-01-10
?
BIG阳

TA贡献1859条经验 获得超6个赞

一个疯狂的猜测,但也许可以尝试

var result UserResp

而不是使用指针。

同样正如沃尔特所提到的,您也应该导出该Users字段。


查看完整回答
反对 回复 2022-01-10
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

  1. users没有出口,应该是Users

  2. 您不需要指向指针的指针,我个人只是使用var result UserResp.

以下更正:

type UserResp struct {

    Users []string 

}

var result UserResp

err := coll.Find(bson.M{"id": depID}).Select(bson.M{"users": 1}).One(&result)

如果这些不是问题,那么我在处理 BSON 和数组/切片时遇到了很多问题。您可以尝试制作Users一个界面,或者将整个输出写入 bson.M 映射 ( map[string]interface{}) 并从那里开始。我会这样做:


var result bson.M

err := coll.Find(bson.M{"id": depID}).Select(bson.M{"users": 1}).One(&result)

您可以使用类型断言访问基础数据:


result["users"].([]string)

如果这不起作用,只需检查底层数据以调试返回的类型:


fmt.Printf("%+v", result)

无论哪种方式,一旦你像这样在 Go 中拥有数据。调试起来会容易得多。


查看完整回答
反对 回复 2022-01-10
  • 3 回答
  • 0 关注
  • 226 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信