2015-11-11 6 views
1

Я использую thrift в моем проекте, бережливость будет генерировать код следующим образом:Могу ли я использовать теги json в качестве json-тегов в mgo?

type CvJdRelationInfo struct { 
    JdId   string `thrift:"jdId,1" json:"jdId"` 
    CvId   string `thrift:"cvId,2" json:"cvId"` 
    Status   int16 `thrift:"status,3" json:"status"` 
    AcceptTimestamp int64 `thrift:"acceptTimestamp,4" json:"acceptTimestamp"` 
} 

как вы видите бережливость уже генерируют json tags (но no bson tags), когда я использую mgo сохранить запись, mgo будет автоматически конвертировано:

JdId -> jdid 
CvId -> cvid 
Status -> status 
AcceptTimeStamp -> accepttimestamp 

, что мне нужно это:

type CvJdRelationInfo struct { 
    JdId   string `thrift:"jdId,1" json:"jdId" bson:"jdId"` 
    CvId   string `thrift:"cvId,2" json:"cvId" bson:"cvId"` 
    Status   int16 `thrift:"status,3" json:"status" bson:"status"` 
    AcceptTimestamp int64 `thrift:"acceptTimestamp,4" json:"acceptTimestamp" bson:"acceptTimestamp"` 
} 

как ваш можно видеть, bson tags - это то же самое, что и json tags. Могу ли я использовать json tags как bson tags?

ответ

0

MongoDB фактически хранит данные как двоичный JSON (bson), который отличается от JSON. Это немного запутанно, потому что, если вы получаете доступ к базе данных с помощью оболочки mongo, вы получаете исходный JSON, но на самом деле это конверсия, это не формат хранения. Поэтому при хранении данных в базе данных драйвер «mgo» сериализуется как bson.

Этот сериализационный код игнорирует ключи экспорта json и выбирает соответствующее имя по умолчанию для строчной версии вашего поля структуры. (См. bson.Marshal go doc.) Если вы укажете ключ экспорта bson, он будет игнорировать имя поля структуры и перейти с тем, что вы указали в качестве ключа экспорта bson.

Например,

type User struct { 
    Name string 
    UserAge int `bson:"age"` 
    Phone string `json:"phoneNumber"` 
} 

приведет к следующей структуре в MongoDB:

{ 
    "name": "", 
    "age": 0, 
    "phone": "" 
} 

Так что похоже ваши поля Struct должен обрабатывать большинство вещей для вас.

Тот «Гоча», что вы не можете увидеть, пока он не кусает вас есть, если вы не зададите экспорта ключей bson, вы не имеете возможности сделать bson:",omitempty" для выезда из пустых полей или bson:",inline" для marshaling встроенные (или вложенные) структуры.

Например, это, как вы бы обрабатывать вложенные структуры:

type Employee struct { 
    User `bson:",inline"` 
    JobTitle string 
    EmployeeId string 
    Salary int 
} 

Такого рода вещи указаны в этой ссылке я представил на bson.Marshal. Надеюсь, это поможет!