Могу ли я использовать теги json в качестве тегов bson в mgo?

Я использую 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"`
}

как вы видите, экономия уже генерирует 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, вы получаете необработанный JSON, но на самом деле это преобразование, а не формат хранения. Таким образом, при сохранении данных в базе данных драйвер «mgo» сериализуется как bson.

Эта сериализация игнорирует ключи экспорта json и выбирает соответствующее имя, по умолчанию используя строчную версию поля структуры. (См. документ bson.Marshal go.) Если указать bson export, он затем проигнорирует имя поля структуры и будет использовать то, что вы указали в качестве ключа экспорта 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, по самое определение, является текстовым и, следовательно, не бинарным. Даже двоичное представление JSON 1-к-1 (которым BSON определенно не является) все равно не будет двоичным JSON. CBOR, вероятно, является наиболее близким стандартом к представлению 1-к-1 JSON-to-binary, но это все еще явно не двоичный 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