【问题标题】:How to use Find().Select().One() in go mongo-driver library如何在 go mongo-driver 库中使用 Find().Select().One()
【发布时间】:2026-01-10 17:35:01
【问题描述】:

此代码在 go mgo 库中运行良好 结果界面{}

err = getCollection.Find(bson.M{}).Select(bson.M{"_id": 1}).One(&result)

但我想使用 go mongo-driver 库执行此操作 我试过下面的代码,但它不像上面的那样工作

err = getCollection.FindOne(ctx, bson.M{}, options.FindOne().SetProjection(bson.M{"_id": 1})).Decode(&result)

我的test收集数据是

example{
"_id":ObjectId(),
"Name":"qwert"
}

有人建议我如何在 mongo-driver 中实现这一点?

【问题讨论】:

  • 您对投影的使用是正确的。它会在结果中返回名称字段吗? result 的类型是什么?在调用此函数之前,您确定名称字段为空吗?

标签: mongodb go


【解决方案1】:

我无法评论你的问题,因为我是这里的新贡献者,我现在在我的项目中使用 mongo-driver,我试图只获取投影,只显示一些要显示的字段, 你能具体说明一下第二个过滤的参数吗?

var (
   opt options.FindOneOptions
   modelStruct model.Person
)

filter := bson.M{"email": "hello@test.com"}
opt.SetProjection(bson.M{"name": 1})

err := collection.findOne(context.Background(), filter, opt).Decode(&modelStruct)

如果这不起作用,那么你应该限制 struct ,确保你的 model.Person 有这样的数据

type Person struct {
  Name   string `json:"name" bson:"name"`
  Gender string `json:"gender" bson:"gender"`
}

或者您可以制作自己的模型来限制字段:

var personLimitOnlyGetName struct {
 Name   string `json:"name" bson:"name"`
}

// please look carefully in your collection field for camelCase
opt.SetProjection(bson.M{"name": 1})

【讨论】: