Golang/mgo: 在插入时忽略空字段

3
由于某些原因,mgo 将空结构插入数据库中作为 null 值,即使我已经设置了 omitempty 选项。
package main

import (
    "fmt"
    "encoding/json"
)

type A struct {
    A bool
}

type B struct {
    X       int `json:"x,omitempty" bson:"x,omitempty"`
    SomeA   *A `json:"a,omitempty" bson:"a,omitempty"`
}

func main() {
    b := B{}
    b.X = 123

    if buf, err := json.MarshalIndent(&b, "", " "); err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(string(buf))
    }
}

JSON编码器省略了SomeA属性,但在数据库中,它的值是"a": null。我做错了什么吗?还是这种方式根本不可行?

你能展示一下你是如何将它插入到Mongo中的吗? - Simon Whitehead
该值应被跳过:http://bazaar.launchpad.net/+branch/mgo/v2/view/head:/bson/encode.go#L165 - Simon Fox
我在结构体A中有一个额外的字段:Id bson.ObjectId bson:"_id",然后我只需调用Insert函数: err = db.Mongo.C("collection").Insert(&b) - Andrew
哦天啊,现在它终于能工作了。问题是我在 JSON 和 BSON 编码器选项之间使用了制表符而不是单个空格。感谢您的帮助! - Andrew
@Andrew - 你能把那个作为答案发布并接受它,以帮助其他有同样问题的人吗?谢谢。 - Timothy Jones
是的,完成了,抱歉。不过不能接受自己的回答。 - Andrew
1个回答

8

嗯,问题在于json和bson编码器选项之间有制表符,这就是为什么omitempty无法工作的原因。所以这是错误的

SomeA   *A `json:"a,omitempty"         bson:"a,omitempty"`

只需一个空格,一切都正确

SomeA   *A `json:"a,omitempty" bson:"a,omitempty"`

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接