2014-09-18 212 views
3

由於某種原因,mgo將空結構插入數據庫爲空值,即使我設置了omitempty選項。golang/mgo:忽略插入的空字段

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。 我做錯了什麼,或者根本不可能這樣做?

+0

你能告訴我們你是如何將其插入蒙戈? – 2014-09-18 23:31:04

+0

應該跳過該值:http://bazaar.launchpad.net/+branch/mgo/v2/view/head:/bson/encode.go#L165 – 2014-09-18 23:44:55

+0

我在結構A中有一個額外的字段:Id bson.ObjectId 'bson:「_ id」'我簡單地調用Insert函數: err = db.Mongo.C(「collection」)。Insert(&b) – Andrew 2014-09-18 23:45:35

回答

5

是的,所以問題是JSON和BSON編碼器選項之間的標籤,這就是爲什麼omitempty沒有工作。因此,這是錯誤的

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

,而不是僅僅有一個單一的空間,這一切都

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