我可以让MongoDb用代理类型替换字段表示吗?

我想有一个带有位置的元数据 struct .为了节省来回转换,我希望与我的JSON(用于API)和BSON(用于MongoDB)共享模型.

我可以使用像这样的 struct

type GeoJson struct {
    Type        string    `bson:"type", json:"type"`
    Coordinates []float64 `bson:"coordinates", json:"coor"`
}

type Metadata struct {
   CaptureTime time.Time `bson:"time", json:"time"`
   Coordinate  GeoJson   `bson:"geo", json:"geo"`
}

但接下来,我将不得不在我的应用程序中使用GeoJson,这让我很不舒服.我宁愿用一些

type GeoLocation struct {
   Latitude float64 `json:"lat"`
   Longitude float64 `json:"lon"`
}

哪一个更"人类可读性".尤其是当GeoJson是反向(Lon,Lon,而不是普通的Lat,Lon)时.

但如果我将其用于MongoDB struct --我将失go MongoDB必须提供的所有地理定位好处.

我可以告诉MongoDb在写入时将GeoLocation{lat, lon}映射到GeoJson{type: "point", coordinates:{lon, lat}},而在读取时映射到GeoJson{type: "point", coordinates:{lon, lat}}吗?

推荐答案

您应该能够使用定制的封送拆收器/反封送拆收器进行地理位置定位:

func (g GeoLocation) MarshalBSON() ([]byte,error) {
   // convert g to GeoJson
   return bson.Marshal(geojson)
}

func (g *GeoLocation) UnmarshalBSON(b []byte) error {
   var gj GeoJson
   if err:=bson.Unmarshal(b,&gj); err!=nil {
      return err
   }
   // Convert gj back to g
}

Mongodb相关问答推荐

MongoDB(Mongoose)条件判断没有像我预期的那样工作

用其他集合中的文档替换嵌套文档数组中的值

MongoDB Aggregate:查找每个月的交叉日期范围的数量

如何在MongoDB中通过限制和跳过查找项进行匹配

Golang mongodb聚合错误:管道阶段规范对象必须包含一个字段

为什么这个查询可以在MongoDB中使用?

Mongo Aggregate管道-另一个集合中的多个查找

如何填充Mongoose中的嵌套引用

MongoDB - 将属性添加到数组中的对象(如果不存在)

Mongoose 查询以获取内部数组和该内部数组中的特定元素

MongoDB - 文档中多个数组大小的总和

连接到远程 mongo 服务器导致异常连接失败

MongoDB C# 驱动程序 - 如何将 _id 存储为 ObjectId 但映射到字符串 Id 属性?

哪个库最适合用于带有 Scala 的 MongoDB?

Mongodb:查询嵌套在数组中的json对象

MongoDB 1.6.5:如何重命名集合中的字段

在 MongoDB 中合并两个集合

如何从 Mongoose 模型对象中获取集合名称

无法连接到远程服务器上的 mongo

MongoDB 查询:字段不存在或具有特定值