Json 在使用MongoDB将文档分配给Go中的结构之前,如何转换文档?
我正在用go和mongodb编写一个多语言API。我有一份mongo db文档,格式如下:Json 在使用MongoDB将文档分配给Go中的结构之前,如何转换文档?,json,mongodb,go,internationalization,bson,Json,Mongodb,Go,Internationalization,Bson,我正在用go和mongodb编写一个多语言API。我有一份mongo db文档,格式如下: { _id : ObjectID(bla) "key" : { "en" : "Hello", "es" : "Hola" } } 但是,API需要以以下形式报告json: { _id : ObjectID(bla), "key" : "Hola" } 如果客户端发送语言头 有没有一种简单/有效的方法可以做到这一点?我唯一可行的解决方案是创建两个独立的结构,然后用一
{
_id : ObjectID(bla)
"key" : {
"en" : "Hello",
"es" : "Hola"
}
}
但是,API需要以以下形式报告json:
{
_id : ObjectID(bla),
"key" : "Hola"
}
如果客户端发送语言头
有没有一种简单/有效的方法可以做到这一点?我唯一可行的解决方案是创建两个独立的结构,然后用一组switch/case语句将它们合并在一起,如:
var api MyStruct
var mgo MyMgoStruct
session.DB("db").C("col").Find(nil).One(&mgo)
api.ID = mgo.ID
switch lang {
default:
{
api.Key = string(mgo.Key.En)
}
case "es":
{
api.Key = string(mgo.Key.Es)
}
}
结构定义:
type Translation struct {
En string `bson:"en"`
Es string `bson:"es"`
}
type MyStruct struct {
ID bson.ObjectID `json:"_id" bson:"_id"`
Key string `json:"key" bson:"key"`
}
type MyMgoStruct struct {
ID bson.ObjectID `json:"_id" bson:"_id"`
Key Translation `json:"key" bson:"key"`
}
我预见这将成为维护的巨大痛苦,因为我的结构有几十个翻译字段。我更喜欢一种转换MongoDB文档的方法,用一个简单的键值对替换转换json结构,就像MyStruct结构一样
我唯一可行的解决方案是创建两个独立的结构,然后用一堆switch/case语句将它们合并在一起
另一种选择是,您可以在服务器上使用MongoDB投影。给定您的示例文档格式,例如:
// Client input language header as variable
var languageInput = "es"
// Concatenate to get field nest 'key'
key := "key." + languageInput
// Only project the specific fields
cursor := coll.Find(nil).Select(bson.M{key: 1})
type MyStruct struct {
ID bson.ObjectId `json:"id" bson:"_id"`
OtherFields bson.M `bson:",inline"`
}
另见
如果结构中有许多不想映射的翻译字段,可以使用bson inline
。例如:
// Client input language header as variable
var languageInput = "es"
// Concatenate to get field nest 'key'
key := "key." + languageInput
// Only project the specific fields
cursor := coll.Find(nil).Select(bson.M{key: 1})
type MyStruct struct {
ID bson.ObjectId `json:"id" bson:"_id"`
OtherFields bson.M `bson:",inline"`
}
这将捕获
其他字段中的非结构化字段。另请参见您可以创建两个不同的集合(表),如果您使用的是mongo 3.2或更高版本,则可以使用查找功能。第一个表包含可以在第二个表中查找正确信息的语言信息。。。另一种方法是用单一语言存储信息,并在发送响应之前进行翻译,而不是存储翻译后的版本。我认为第二种方法是最好的。您可以使用单个结构。通过编写更多的翻译函数,可以更容易地支持两种以上的语言。