登录
首页 >  Golang >  Go问答

利用 MongoDB 的投影功能

来源:stackoverflow

时间:2024-02-18 23:45:25 152浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《利用 MongoDB 的投影功能》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

我的数据库中有以下结构:

{
  "_id": {
    "$oid": "5fc4fc68fcd604bac9f61f71"
  },
  "init": {
    "fullname": "besikta anibula",
    "parts": [
      "besikta",
      "anibula"
    ],
    "alt": "besikta ani."
  },
  "industry": "e-commerce"
}

我试图访问 init 对象并将结果写入 go 中的结构化变量:

var inputdata struct {
    fullname    string  `bson:"fullname" json:"fullname"`
    parts       []string`bson:"parts" json:"parts"`
    alt         string  `bson:"alt" json:"alt"`
}

collectionresults.findone(ctx, options.findone().setprojection(bson.m{"init": 1})).decode(&inputdata)
js, _ := json.marshal(inputdata)
fmt.fprint(writer, string(js))

但是结果是空的:

{"fullname":"","parts":null,"alt":""}

它在不使用像这样的投影时工作:

var inputdata struct {
    ident   primitive.objectid `bson:"_id" json:"id"`
}

collectionresults.findone(ctx, bson.m{}).decode(&inputdata)
js, _ := json.marshal(inputdata)
fmt.fprint(writer, string(js))

结果符合预期:

{"id":"5fc4fc68fcd604bac9f61f71"}

解决方案


您将投影设置为仅检索结果文档的 init 属性,然后尝试解组为没有任何与 init 值匹配的字段的结构体值,因此该结构体值中不会设置任何内容。

您必须使用具有 init 字段的值,例如此包装器 result 结构:

type result struct {
    init inputdata `bson:"init"`
}
type inputdata struct {
    fullname    string   `bson:"fullname" json:"fullname"`
    parts       []string `bson:"parts" json:"parts"`
    alt         string   `bson:"alt" json:"alt"`
}

像这样使用它:

var result Result
err := collectionRESULTS.FindOne(ctx, bson.M{}, options.FindOne().
    SetProjection(bson.M{"init": 1})).Decode(&result)
if err != nil {
    // handle error
}

到这里,我们也就讲完了《利用 MongoDB 的投影功能》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>