Json 在使用MongoDB将文档分配给Go中的结构之前,如何转换文档?

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" } 如果客户端发送语言头 有没有一种简单/有效的方法可以做到这一点?我唯一可行的解决方案是创建两个独立的结构,然后用一

我正在用go和mongodb编写一个多语言API。我有一份mongo db文档,格式如下:

{
  _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或更高版本,则可以使用查找功能。第一个表包含可以在第二个表中查找正确信息的语言信息。。。另一种方法是用单一语言存储信息,并在发送响应之前进行翻译,而不是存储翻译后的版本。我认为第二种方法是最好的。您可以使用单个结构。通过编写更多的翻译函数,可以更容易地支持两种以上的语言。