Мога ли да използвам json тагове като bson тагове в mgo?

Използвам thrift в моя проект, thrift ще генерира код, както следва:

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"`
}

както виждате thrift вече генерира 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?


person roger    schedule 11.11.2015    source източник


Отговори (2)


MongoDB всъщност съхранява данните като двоичен JSON (bson), който е различен от JSON. Това е леко объркващо, защото ако осъществите достъп до базата данни с помощта на mongo shell, получавате обратно необработен JSON, но това всъщност е преобразуване, а не форматът за съхранение. Така че при съхраняване на данните в базата данни драйверът "mgo" се сериализира като bson.

Това сериализиране игнорира ключовете за експортиране json и избира подходящото име, като по подразбиране използва версията с малки букви на вашето структурно поле. (Вижте bson.Marshal go doc.) Ако посочите bson ключ за експортиране, след това ще игнорира името на полето struct и ще използва това, което сте посочили като ключ за експортиране bson.

Например,

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

ще доведе до следната структура в MongoDB:

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

Така че изглежда, че структурните ви полета трябва да се справят с повечето неща вместо вас.

Единственият проблем, който може да не видите, докато не ви ухапе, е, че ако не посочите bson ключовете за експортиране, нямате възможност да направите bson:",omitempty" за оставяне на празни полета или bson:",inline" за маршалинг вградени (или вложени) структури.

Например, ето как бихте се справили с вградените структури:

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

Тези видове неща са посочени в тази връзка, която предоставих на bson.Marshal. Надявам се това да помогне!

person Michael Baxter    schedule 11.11.2015
comment
Извикването на двоичен JSON на BSON е неточно. Няма такова нещо като двоичен JSON. - person Flimzy; 02.01.2020
comment
@Flimzy може да се интересувате от тези връзки bsonspec.org en.wikipedia.org/wiki/BSON - person Limatuz; 22.01.2020
comment
@Limatuz: Обърнете внимание на подобната на JSON терминология в първото изречение. JSON, според самата дефиниция е базиран на текст и следователно не е двоичен. Дори двоично представяне 1 към 1 на JSON (което BSON определено не е) пак няма да бъде двоичен JSON. CBOR е може би най-близкият стандарт до JSON към двоично представяне 1 към 1, но все още очевидно не е двоичен JSON. - person Flimzy; 22.01.2020

Можете да използвате следното (От файла за тест за пестеливост git.apache.org/thrift.git/lib/go/test/GoTagTest.thrift)

struct tagged {
    1: string string_thing,
    2: i64 int_thing (go.tag = "json:\"int_thing,string\""),
    3: optional i64 optional_int_thing
}
person Alan Lavintman    schedule 29.11.2018